我正在尝试打印出十六进制数字。
我尝试打印的变量是int i
类型,当我:
printf("%06X", i);
如果数字是负数,它总是给我8位数,如果是正数,它总是给我8位数。
如果我将"%06"
更改为"%04"
或其他内容,如果值为负数,则总是会得到8位数字无关紧要。
答案 0 :(得分:3)
“%06X”中的“6”指定要打印的最小位数。如果需要更多值以显示完整值,则转换将打印更多。如果该值小于所请求的最小位数,则“0”表示使用前导零而不是空格的默认值。
你得到八位数,因为“X”说明符是unsigned int
参数。没有负unsigned int
值。您的C实现正在重新解释将负int
编码为无符号int
的位。例如,int
值-1以32位二进制补码形式存储为0xffffffff。因此,格式转换会看到unsigned int
设置了高位,并且它使用显示它们所需的所有数字。
您可以或应该做出一些更改:
首先,您不应为期望int
的说明符传递unsigned int
。您应该使用强制转换将int
转换为unsigned int
,如(unsigned int) i
中所示。
其次,您应该传递您想要打印的值。如果只打印低六位十六进制数字,则可以使用带AND运算符的掩码传递这些数字:printf("%06X", (unsigned int) i & 0xffffff)
。
或者,如果要打印带符号的十六进制值,则必须自己处理该符号,如下所示:
if (0 <= i)
printf(" %06X", (unsigned int) i);
else
printf("-%06X", (unsigned int) -i);
(后者假设i
永远不会是-i
溢出的足够大的负值。如果-i
可能溢出,可以使用简单的修改来获得所需的行为。)
答案 1 :(得分:0)
使用2's Complement以二进制表示存储的负数。这意味着,二进制中的负数具有前导1。与this calculator一起玩,以更好地感受它。
如果您要求printf
使用%X
格式化数字,则该号码将被视为未签名。如果你处理一个负数的二进制表示,忽略了我可能是负数的可能性,即忽略前导1作为负数的标志,那么你只能评估该数字实际上是更大的。 / p>
06
部分告诉printf
填充数字,前导0最多六位数。当然,如果数字已超过6位数,则无关紧要。