问题
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");
5881

被折叠的 条评论
为什么被折叠?



