有符号与无符号比较原理分析

 

今天空了又重温了一下C,针对之前强哥提的问题,我仔细想了下,举个例子:

假如当前buff[1]=0111 1111B;  buff[2]=1000 0000B;

buff定义为char类型,一般系统隐含为signed char,

 

  • 执行buff[1] == ~buff[2]运算时,

buff[1]由signed char自动转化为int,又因buff[1]符号位为0,则高位补0,结果为00000000 00000000 00000000 01111111B;

buff[2]由signed char自动转化为int,又因buff[1]符号位为1,则符号位扩展高位补1,结果为11111111 11111111 11111111 1000 0000B;

再执行~ buff[2],结果为00000000 00000000 00000000 01111111B;

故buff[1]==~buff[2]相等。

 

  • 执行uint8_t data1 = ~buff[2]运算时,

buff[2]由signed char自动转化为int,又因buff[1]符号位为1,则符号位扩展高位补1,结果为11111111 11111111 11111111 1000 0000B;

其次执行~ buff[2],结果为00000000 00000000 00000000 01111111B;

再执行赋值操作时,由于data1为unsigned char,必须强制类型转换,采用截断方式,只取低8位,故data1等于01111111B;

再判断buff[1] == data1,

buff[1]由signed char自动转化为int,又因buff[1]符号位为0,则高位补0,结果为00000000 00000000 00000000 01111111B;

data1由unsigned char自动转化为int,高位直接补0,结果为00000000 00000000 00000000 01111111B;

故buff[1] == data1不相等;

 

综上所述,由于将buff定义为char,导致问题出现,建议将buff定义为unsigned char则可避免;或者将data1定义为char也可避免;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值