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