关于 c c++中的移位操作,是真正物理内存上的左移,右移,还是逻辑数字上的移动?
比如一个4字节的int值:0x000000ff。在big_endian和little_endian机器上的字节顺序是反的,但是,不管是什么样的机器,你左移8个bit之后,...
比如一个4字节的int值:0x000000ff。在big_endian和little_endian机器上的字节顺序是反的,但是,不管是什么样的机器,你左移8个bit之后,值总是0x0000ff00。这样看上去就是:我们把数据变成二进制,然后左移,而并非是直接从物理内存上左移,因为物理内存左移右移在不同机器下结果应该是不一样的。解释清楚了,继续加分
展开
3个回答
展开全部
首先,数据不用变成二进制,因为他们在内存中本身就是二进制的,再有在指令集中有专门的移位指令,移位指令分为两种,一种是循环移位,一种是顺序移位(移位后空位会补零),对于32位机4字节的int值移位只要执行移位指令那么ALU(算术逻辑单元)会将需要移位的的物理内存中的数装入寄存器A,然后执行移位操作,再把寄存器A的内容装回到相应的物理内存中。位数较少的处理器就比较麻烦了,因为要涉及进位和借位操作,就不是一条指令能够完成的了
追问
我说的转成二进制是逻辑上的十进制转成二进制,不是说电脑真的执行了操作。然后问一句,一台big_endian机器上(32位)的整数0x000000ff,在物理内存上存储顺序是ff 00 00 00,当这个整数读到寄存器A之后,顺序是 ff 00 00 00还是00 00 00 ff?或者是需要考虑其他的影响因素?
追答
A寄存器是一个独立寄存器,因此不存在你说的顺序问题,你提的问题指的是存储器组织结构,这种结构对于存储器组或是内存块这样的结构才有意义,就好像举例来说我们看的书大部分是从左向右读写的,但是很多匾额从右向左读写,那么如果单拿出一个字那就不存在从左向右还是从右向左读写的问题了
展开全部
物理内存只是一个保存数据的东西,具体的操作是由CPU执行的啊
假设一个数据在物理内存上,为了位移,我们首先把它取出来到CPU里,不管它在内存里是什么方式,在CPU里都可以认为它是一致的,理解没?
然后在CPU里面进行位移操作,至于是否要再写入到物理内存中,那是程序的问题,例如你写
首先因为所有运算都是cpu完成的,所以也不能存在直接从物理内存上左移右移的问题,其次内存到底是大头端还是小头端的,对c/c++程序员,基本上可以认为是透明的,无所谓的。你有见过哪本c/c++程序书里面写,如果平台是大头端那么程序要这么这么写,平台是小头端,程序要这么这么写的吗?没有吧?为什么呢,因为那无所谓
假设你写
int a = 0x000000ff;
int b = a<<8;
那么过程就是把a的内存数据取出到cpu,位移计算,然后保存到b这个变量的数据空间去
假设一个数据在物理内存上,为了位移,我们首先把它取出来到CPU里,不管它在内存里是什么方式,在CPU里都可以认为它是一致的,理解没?
然后在CPU里面进行位移操作,至于是否要再写入到物理内存中,那是程序的问题,例如你写
首先因为所有运算都是cpu完成的,所以也不能存在直接从物理内存上左移右移的问题,其次内存到底是大头端还是小头端的,对c/c++程序员,基本上可以认为是透明的,无所谓的。你有见过哪本c/c++程序书里面写,如果平台是大头端那么程序要这么这么写,平台是小头端,程序要这么这么写的吗?没有吧?为什么呢,因为那无所谓
假设你写
int a = 0x000000ff;
int b = a<<8;
那么过程就是把a的内存数据取出到cpu,位移计算,然后保存到b这个变量的数据空间去
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你想的太深了,高级程序语言不会涉及物理层面的存储问题的,就只是逻辑上的移动。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询