Bug 20535 – std.format: %b, %o, %x and %X on negative integers gives wrong result

Status
REOPENED
Severity
enhancement
Priority
P4
Component
phobos
Product
D
Version
D2
Platform
All
OS
All
Creation time
2020-01-26T13:29:58Z
Last change time
2024-12-01T16:36:15Z
Assigned to
berni44
Creator
berni44
Moved to GitHub: phobos#10404 →

Comments

Comment #0 by bugzilla — 2020-01-26T13:29:58Z
Currently format casts the value to it's unsigned version and prints that. This is inconsistent with %d. Additionally, if this behaviour is wished, it can easily be accomplished by the user casting himself before formatting. void main() { import std.format : format; assert(format("%b",-17) == "-10001"); // fails assert(format("%o",-17) == "-21"); // fails assert(format("%x",-17) == "-11"); // fails assert(format("%X",-17) == "-11"); // fails }
Comment #1 by qs.il.paperinik — 2020-12-03T18:54:29Z
Reading https://dlang.org/phobos/std_format.html#formattedWrite section 'b','d','o','x','X': > [...] If the argument is a signed type and the FormatChar is d it is converted to a signed string of characters, otherwise it is treated as unsigned. [...] So, clearly, the intended result for negative numbers is not a minus sign and magnitude, but two's complement.
Comment #2 by bugzilla — 2021-03-01T19:55:38Z
Even, if the current specs state it, this is inconsistent behavior and while it's easy for a user to get the current behavior with a changed implementation it is not possible to get the wished for behavior with the current implementation. So I'm reopening this, but changing to enhancement.
Comment #3 by robert.schadek — 2024-12-01T16:36:15Z
THIS ISSUE HAS BEEN MOVED TO GITHUB https://github.com/dlang/phobos/issues/10404 DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB