c语言右移高位如何补1,c语言负数左移右移

本文探讨了C语言中左移和右移操作对有符号和无符号数值的影响。通过实例分析,指出左移始终是逻辑左移,丢弃高位并补0;而右移对于有符号数是算术右移,正数补0,负数补1,无符号数则是逻辑右移。最后,文章强调了在进行位移操作后,为确保数值正确,应与高位清零的操作结合使用。
摘要由CSDN通过智能技术生成

事情的发生:

某日工作中有个需求是将不同的数值存到char的前4位和后4位中。

恰好同事中有同样取得32位int的前8位当成一个数值的代码:

//取得32位中的高八位组成的值

#define U32_HIGH_8(val) ((val >> 24) & 0X000000FF)

好奇心就来了,在右移24位以后是否还有必要再与上(&)0x000000FF将高位的数据彻底清零呢?

讨论:

考虑以下几个问题:

(1)

char i = 0x40; //二进制中i的表示为:0100 0000

unsighedchar j = 0x40;

i<<= 1;

j<<= 1;//问:i和j分别等于多少?

i 左移以后的二进制表示为:1000 0000,由定义的有符号char解释为:i = -128

j 左移以后的二进制表示为:1000 0000,由定义的无符号(unsigned char)解释为:i = 128

(2)

char i = 0x80;//二进制中表示为:1000 0000

char j = 0x40;//二进制中i的表示为:0100 0000

j >>= 1;

i>>= 1;//问i和j等于多少?

i 右移以后的二进制表示为:1100 0000(右移对于负数来说符号位右移,高位补1),故i=-64<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值