问题
for (size_t i = 0; i < FRAME_SIZE; i++)
{
printf("%02X ", array.buffer[i]);
}
printf("\n");
打印出现很多0xFFFFFF
原因
signed char 范围 :-128
~ 127
unsigned char 范围:0~255
在C语言中,当使用`%02X`格式化输出一个`char`类型的变量时,如果该变量的值大于127(即二进制的最高位为1),`printf`函数会将其视为一个有符号的负数,并按照补码的形式输出(正数的原码反码补码一样,输出补码不影响)。
使用 %02X
格式化输出 char
时,实际上是将其作为 int
处理。如果 char
的值为负数,输出的结果会是负数的二进制补码表示。
char 类型的0xAD
- 将
0xAD
转换为十进制:0xAD = 173
- 有符号的
char
,取值范围是-128
到127
。因此,173 超出了这个范围。 - 当
char
是有符号的,值为-83
(在内存中以补码形式存储为11111011
)。 - 当这个
char
被提升为int
时,发生符号扩展:原始的11111011
(8 位)变为11111111 11111111 11111111 11111011
(32 位)。既输出0xFFFFFFAD
如何避免?
将`char`类型的变量强制转换为`unsigned char`类型,这样`printf`函数就会将其视为一个无符号的整数,而不会在前面填充1。
for (size_t i = 0; i < FRAME_SIZE; i++)
{
printf("%02X ", (unsigned char)array.buffer[i]);
}
printf("\n");