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

use*_*747 3 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]);
Run Code Online (Sandbox Code Playgroud)

这给了我输出:

-38
4
7
Run Code Online (Sandbox Code Playgroud)

但是我期待:

218
4
7
Run Code Online (Sandbox Code Playgroud)

谢谢.

Edw*_*nge 8

char已签名.使用unsigned char.

也使用%ud.

  • `char`并不总是签名.如果重要,你应该明确(使用`signed`或`unsigned`).或者,更好的是,使用`uint8_t`. (10认同)
  • 不要转换缓冲区类型,只需将其设置为无符号即可. (3认同)

Rob*_*edy 8

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

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

  • 我有时会屏蔽该值以确保转换为`unsigned`不会首先签名扩展,即`buffer_b [0]&0xff`. (2认同)