char buf 用%02X打印出来的单字节有一堆FFFFFF

 问题

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,取值范围是 -128127。因此,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");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值