以十六进制打印负数是否有隐含的字长?
Is there an implied word size for printing negative numbers in hexadecimal?
以下所有内容产生相同的输出ffffffef
:
printf("%x\n", -17);
printf("%2x\n", -17);
printf("%8x\n", -17);
为什么?
%x
in printf()
需要一个 unsigned int
参数。假设 int
是 32 位,在您的示例中,-17
转换为 4294967279u
(0xffffffef
)。这意味着格式化输出至少为 8 个字符,即使您使用 %x
或 %2x
.
如果使用:
你会得到不同的结果
printf("%hx\n", -17); // ffef
在此示例中,%hx
需要 unsigned short
,因此结果不同。
在%2x
、%4x
和%8x
中,这里的数字表示将打印的最小字符宽度。现在由于 ffffffef
是 8 个字符宽,所以三种情况下打印的都是一样的,因为字符宽度是 >=
指定的数字。如果指定格式时的数字是 >= 8
,那么您会在开头看到一个额外的 space(这取决于您指定打印格式的方式)。
以下所有内容产生相同的输出ffffffef
:
printf("%x\n", -17);
printf("%2x\n", -17);
printf("%8x\n", -17);
为什么?
%x
in printf()
需要一个 unsigned int
参数。假设 int
是 32 位,在您的示例中,-17
转换为 4294967279u
(0xffffffef
)。这意味着格式化输出至少为 8 个字符,即使您使用 %x
或 %2x
.
如果使用:
你会得到不同的结果printf("%hx\n", -17); // ffef
在此示例中,%hx
需要 unsigned short
,因此结果不同。
在%2x
、%4x
和%8x
中,这里的数字表示将打印的最小字符宽度。现在由于 ffffffef
是 8 个字符宽,所以三种情况下打印的都是一样的,因为字符宽度是 >=
指定的数字。如果指定格式时的数字是 >= 8
,那么您会在开头看到一个额外的 space(这取决于您指定打印格式的方式)。