打印出负十六进制数

时间:2012-12-30 13:19:39

标签: c printf hex

  

可能重复:
  how to print signed hex in c

我正在尝试打印出十六进制数字。

我尝试打印的变量是int i类型,当我:

printf("%06X", i);
如果数字是负数,它总是给我8位数,如果是正数,它总是给我8位数。

如果我将"%06"更改为"%04"或其他内容,如果值为负数,则总是会得到8位数字无关紧要。

2 个答案:

答案 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位数,则无关紧要。