C语言移位本质

文章讲述了在32位CPU环境下,short、char和int类型的移位运算原理,强调了移位后可能的数据截断问题,并提供了SWAP32和SWAP64的示例,以及处理64位数据移位时需要强制类型转换的技巧。
摘要由CSDN通过智能技术生成

前提:32位CPU,int型4字节,long型8字节;

1 结论


(1)short、char类型的数据在做移位运算之前,会被自动转换为int类型,然后再进行运算;本质原因:运算过程中CPU会将char型的数据放到寄存器中,因为CPU是32为的所以数据在寄存器中移位的范围也是32位,运算后赋值给左值时会根据左值的字长进行数据的截取;
(2)long经过移位运算后结果为long类型;
(3)特别注意,如果移位前的有效数据位,移位后所在位置超过int型数据的位数上限,则此部分数据会被截断;

2实战


2.1 32位以下移位


综上所述,char、short、int型数据移位时,需要注意移位后有效数据位是否超过32,是的话则会被截断,只保留32bit,实战应用例如:
#define SWAP32(x)    ((((x) & 0x000000FF) << 24) | (((x) & 0x0000FF00) <<  8) | \
                        (((x) & 0x00FF0000) >>  8) | (((x) & 0xFF000000) >> 24))


2.2 32位以上移位


Usigned  long long(uint64)类型数据做移位操作,需要在移位前,移位后都要做数据类型强转,将数据强转成uint64类型(否则系统会默认截断到32bit),实战应用例如:
#define SWAP64(x)    ((uint64_t)((((uint64_t)(x) & (uint64_t)0x00000000000000ffULL) << 56) | \
                        (((uint64_t)(x) & (uint64_t)0x000000000000ff00ULL) << 40) | \
                        (((uint64_t)(x) & (uint64_t)0x0000000000ff0000ULL) << 24) | \
                        (((uint64_t)(x) & (uint64_t)0x00000000ff000000ULL) <<  8) | \
                        (((uint64_t)(x) & (uint64_t)0x000000ff00000000ULL) >>  8) | \
                        (((uint64_t)(x) & (uint64_t)0x0000ff0000000000ULL) >> 24) | \
                        (((uint64_t)(x) & (uint64_t)0x00ff000000000000ULL) >> 40) | \
                        (((uint64_t)(x) & (uint64_t)0xff00000000000000ULL) >> 56) ))

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值