Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 打印负数十六进制_C_Printf_Hex - Fatal编程技术网

C 打印负数十六进制

C 打印负数十六进制,c,printf,hex,C,Printf,Hex,可能重复: 我正在打印十六进制数 我试图打印的变量类型为int I,当我: printf("%06X", i); 如果数字是负数,它总是给我8位数,如果是正数,它总是给我6位数 无论我是否将%06”更改为%04”或其他内容,如果值为负数,我总是会得到8位数字。在“%06X”中的“6”指定要打印的最小位数。如果需要更多打印以显示完整值,则转换将打印更多。如果值小于请求的最小位数,“0”表示使用前导零,而不是默认的空格 因为“X”说明符用于无符号int参数,所以得到的是8位数字。没有负的无符号i

可能重复:

我正在打印十六进制数

我试图打印的变量类型为
int I
,当我:

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


无论我是否将
%06”
更改为
%04”
或其他内容,如果值为负数,我总是会得到8位数字。

在“%06X”中的“6”指定要打印的最小位数。如果需要更多打印以显示完整值,则转换将打印更多。如果值小于请求的最小位数,“0”表示使用前导零,而不是默认的空格

因为“X”说明符用于
无符号int
参数,所以得到的是8位数字。没有负的
无符号int
值。您的C实现正在将编码负数
int
的位重新解释为无符号
int
。例如,
int
值-1以32位2的补码形式存储为0xFFFFFF。因此,格式转换将看到一个设置了高位的
无符号int
,并使用显示它们所需的所有数字

您可以或应该进行以下几项更改:

首先,对于需要
无符号int
的说明符,不应传递
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);

if(0负数存储在二进制中表示为使用。这意味着二进制中的负数具有前导1。请尝试使用以获得更好的感觉

如果您要求
printf
使用
%X
格式化一个数字,该数字将被视为无符号。如果您将负数的二进制表示形式视为忽略I可能是负数的可能性,即忽略前导1作为负数的符号,则您只能计算该数字实际上更大


06
部分告诉
printf
用前导0填充数字,最多6位。当然,如果数字已经超过6位,这是不相关的。

您的问题是什么?您希望得到什么结果?当您使用%x,%x时,printf需要无符号整数。如果I=1,则需要格式000001,如果I=-1,则需要格式FFFFFF(总是6位数)非常感谢我真的很感激