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 }
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.
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.
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