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

时间:2010-04-23 16:04:56

标签: 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

但是我期待:

218
4
7

感谢。

3 个答案:

答案 0 :(得分:8)

char已签名。使用unsigned char。

也使用%ud。

答案 1 :(得分:8)

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

要将值视为无符号,您至少应使用%u格式字符串。然后将数组的元素类型更改为无符号类型,例如unsigned charuint8_t,或者将printf参数键入<{1}}。

答案 2 :(得分:2)

char 0xDA升级为int以传递给printf时,编译器会执行符号扩展,将其转换为0xffffffda,这是-38的32位表示。你期望它被零扩展到0x000000da。要控制编译器如何扩展字符,请将其声明为signed charunsigned char。有符号整数类型通过符号扩展加宽,无符号整数类型通过零扩展加宽。

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