char buffer_b[5] = { 0xDA, 0x00, 0x04, 0x00, 0x07 };
printf("%d\n%d\n%d", buffer_b[0], buffer_b[2], buffer_b[4]);
Run Code Online (Sandbox Code Playgroud)
这给了我输出:
-38
4
7
Run Code Online (Sandbox Code Playgroud)
但是我期待:
218
4
7
Run Code Online (Sandbox Code Playgroud)
谢谢.
char已签名.使用unsigned char.
也使用%ud.
显然,char已在您的环境中签名.(这是一个细节,可以从一个实现到下一个实现不同,有些编译器甚至通过命令行开关为您提供选项.)您打印的数字是0xDA,它具有最高位设置,因此其值是否定的.当编译器将该值传递给printf它时,它会将(signed)char值提升为type int,并保留其否定性.您使用了%d格式字符串,它告诉printf您将其参数解释为有符号值.
要将值视为无符号,您至少应使用%u格式字符串.然后将数组的元素类型更改为无符号类型,例如unsigned charor uint8_t,或者将printf参数键入类型unsigned.