打印
[51单片机]

数据移位过程分析

[复制链接]
631|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小将wzj|  楼主 | 2017-10-16 20:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

数据移位运算
        在C语言中我们经常会用到数据的移位运算,例如16位的数据经过移位运算,换算成2个8位的数据,又或者2个8位的数据经过移位运算转换成一个16位的数据,等等。那么为什么数据可以进行移位运算,移位运算又是怎么进行的?要弄明白这个问题,我们就需要了解C中数据的存储方式。
        大多数计算中的最小的存储单元是一个8位的块(一个字节),每一个存储单元都有它们独有的标示,这个就是我们常说的内存地址,我们的数据就是存储在这样的一个连续的 内存块中,比如16位的数据就占用连续2个存储单元,也就是16个bit,每个bit代表0或者是1,我们在进行移位运算的时候就是对这些存储单元中具体的bit位进行移位操作的。
        在运算中一个8位的数据左移8位后可以直接将数据赋给16位或者32位的数据,这个时候数据不会出错,而如果8位的数据局左移24位的时候,就只有赋给32位数据的时候正确,赋给16位的时候,数据为0,当左移大于24位的时候,数据的bit位就会出现溢出丢失的现象。(以上鉴于32位CPU)。
关于这个现象我不是很清楚是怎么一回事,暂时想到两种答案,不知道是否正确,大家可以一起来探讨一下
1:第一种就是编译器对数据运算进行了优化,他为自动根据机器的类型(大多数是32位)对数据的移位操作进行自动的隐式扩展,根据你移位的位宽对数据进行相应的扩展(最高32位),一旦超过32位,数据就会溢出舍弃
2:第二种就是数据在运算的过程会从内存中去出数据将数据存放在一个32位的寄存器中,这样在数据进行移位运算的过程中,只要不超过限制的位宽,那么数据就不会出现溢出丢弃的显现,移位后在根据左值的位宽进行数据的截取。
char Dat = 0XFF;
short NUM = 0X0000;
NUM = Dat << 8;//NUM = 0XFF00
Dat <<= 8;//Dat = 0x00;
如果NUM为int型数据,则Dat << 24 后NUM的值为0XFF000000,如果左移25位NUM的值就是0XFE000000。

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

44

帖子

1

粉丝