Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.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++_C - Fatal编程技术网

C++ 为什么这个十六进制值输出为负数?

C++ 为什么这个十六进制值输出为负数?,c++,c,C++,C,这给了我输出: char buffer_b[5] = { 0xDA, 0x00, 0x04, 0x00, 0x07 }; printf("%d\n%d\n%d", buffer_b[0], buffer_b[2], buffer_b[4]); 然而,我期望: -38 4 7 谢谢。字符已签名。使用无符号字符 同时使用%ud。显然,char已在您的环境中签名。(这个细节在不同的实现中可能有所不同,有些编译器甚至通过命令行开关为您提供了一个选项。)您正在打印的数字是0xDA,它设置了最高有效位,

这给了我输出:

char buffer_b[5] = { 0xDA, 0x00, 0x04, 0x00, 0x07 };
printf("%d\n%d\n%d", buffer_b[0], buffer_b[2], buffer_b[4]);
然而,我期望:

-38
4
7

谢谢。

字符已签名。使用无符号字符


同时使用%ud。

显然,
char
已在您的环境中签名。(这个细节在不同的实现中可能有所不同,有些编译器甚至通过命令行开关为您提供了一个选项。)您正在打印的数字是0xDA,它设置了最高有效位,因此其值为负值。当编译器将该值传递给
printf
时,它将(有符号的)char值提升为type
int
,并保留其负性。您使用了
%d
格式字符串,它告诉
printf
将其参数解释为有符号值


要将该值视为无符号值,至少应使用
%u
格式字符串。然后将数组的元素类型更改为无符号类型,例如
unsigned char
uint8\u t
,或者在
char
0xDA升级为
int
以传递到
printf
时,将
printf
参数类型转换为
unsigned
,编译器正在执行符号扩展,将其转换为
0xffffffda
,这是
-38
的32位表示形式。您希望将其零扩展到
0x000000da
。要控制编译器如何扩展字符,必须将其声明为
有符号字符
无符号字符
。有符号整数类型通过符号扩展加宽,无符号整数类型通过零扩展加宽


您无法预测任何特定编译器将如何处理不合格的
char
,或者在编译器的下一版本中它是否相同。

char
并不总是经过签名。如果重要的话,您应该以任何一种方式(使用
有符号的
无符号的
)明确表示。或者,更好的方法是使用
uint8\u t
。不要强制转换缓冲区类型,只需先将其设置为无符号。否则,数据来自其他库函数。我有时会屏蔽该值,以确保转换为
无符号
时不会先签名扩展,即
缓冲区b[0]&0xff
218
4
7