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
感谢。
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
感谢。
char被签名。使用无符号字符。
也使用%ud。
显然,char
已在您的环境中签名。 (这是一个细节,可以从一个实现到下一个不同,有些编译器甚至可以通过命令行开关为您提供一个选项。)您打印的数字是0xDA,它具有最重要的位设置,因此它的值是负面的。当编译器将该值传递给printf
时,它会将(signed)char值提升为int
,并保留其消极性。您使用了%d
格式字符串,它告诉printf
将其参数解释为有符号值。
要将该值作为无符号值处理,至少应使用%u
格式字符串。然后,将阵列的元素类型更改为无符号类型,例如unsigned char
或uint8_t
,或者将printf
参数键入unsigned
。
我有时会屏蔽该值以确保转换为'unsigned'不会首先扩展,即'buffer_b [0]&0xff'。 – 2010-04-23 16:28:03
当char
0xDA
提升为int
传递给printf
,编译器正在做一个符号扩展,将其转换为0xffffffda
,这是-38
的32位表示。你期待它被零延伸到0x000000da
。要控制编译器如何扩展字符,请将其声明为signed char
或unsigned char
。有符号整数类型通过符号扩展进行扩展,无符号整数类型通过零扩展进行扩展。
您无法预测任何特定的编译器如何处理不合格的char
,或者它是否与下一版本的编译器相同。
'char'并不总是被签名。如果它很重要,你应该明确的方式(使用'signed'或'unsigned')。或者,更好的是使用'uint8_t'。 – 2010-04-23 16:07:33
谢谢(无符号字符)buffer_b [0]的作品。 – user318747 2010-04-23 16:28:41
不要强制使用缓冲区类型,只需使其无符号即可。 – 2010-04-23 17:49:16