2 cocowuyung cocowuyung 于 2016.03.13 20:02 提问

关于移位运算的一个问题,十分不解

今天发现一个问题, 假如 i = 12, 那么 j = i >> 32, 则j = 12;但是j = i >> 31,j = j >> 1,则j = 0为什么呀。

4个回答

qq423399099
qq423399099   Ds   Rxr 2016.03.13 21:39
已采纳

对于右移大于或等于位宽的操作,或者右移负数的操作,其结果将依赖于编译器的处理和硬件指令的处理,并不唯一。32正好是一个int变量所占的内存,但这种位移的行为是未定义的。由编译器决定,所以没有标准答案。在VC++编译器上是等于原值的
LZ可以看一下汇编的代码就会发现,编译器直接把代码编译成了赋值操作,而没有做移位操作.
所以第一种情况下还是原值,而第二种由于移位小于32位,所以就按正常的移位操作来,就得到了0

danielinbiti
danielinbiti   Ds   Rxr 2016.03.13 21:17

int的位数最大就是32位,移位位数大于或者等于数据类型的位数,则会使用余数进行移位。
也就是32%32=0,等于不位移。
31%32=31,右移31位,肯定变成0了

u014070086
u014070086   2016.03.14 09:11

原来是这样的,长知识 了!谢谢!

hijack00
hijack00   Rxr 2016.08.26 22:54

可以理解为这样的,编译器首先将要移位的数字模32取余数,然后再移相应的位数,这样就能解释上面的现象了。不过,关于移位,不同的编译器可能处理方式不同

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
c语言迷宫问题
关于迷宫的问题,这是一个十分有用的程序代码,很值得一看
计算机组成原运算器及移位运算器实验报告
一、实验目的: 1. 掌握运算器的组成及工作原理; 2.了解4位函数发生器74LS181的组合功能,熟悉运算器执行算术操作和逻辑操作的具体实现过程; 3.验证带进位控制的74LS181的功能。 二、实验设备: EL-JY-II型计算机组成原理实验系统一套,排线若干。
一个奇怪的关于自冲销的问题,不解?
做自冲销的cube没有压缩过,也没有聚集,在执行完第一自冲销的dtp之后,cube的fact table的数据量增加了一倍,这个可以理解。但是在执行完第二次自冲销的DTP之后,数据量并没有翻倍,而是只增加了初始cube的数据量,之后每次执行自冲销的DTP,也只是增加了原始cube
NYOJ155-求高精度幂
求高精度幂 时间限制:3000 ms  |  内存限制:65535 KB 难度:2 描述 对数值很大、精度很高的数进行高精度计算是一类十分常见的问题。比如,对国债进行计算就是属于这类问题。  现在要你解决的问题是:对一个实数R( 0.0 ,要求写程序精确计算 R 的 n 次方(Rn),其中n 是整数并且 0 。 输入 输入有多行,每行有两个数R和n,空格分开。R的数字
移位运算在算法中的简单应用
一、位运算应用口诀      清零取位要用与,某位置一可用或      若要取反和交换,轻轻松松用异或   二、移位运算     1、它们都是双目运算符,两个运算分量都是整形,结果也是整形。     2、"     3、">>"右移:右边的位被挤掉。对于左边移出的空位,如果是正数则空位补0,若为负数,可能补0或补1,这取决于所用的计算机系统,其值相当于除以
移位运算注意事项
一个数乘以2或者除以2总有人喜欢直接左移或者右移一下来表示自己对移位运算的了解。然而很容易掉坑里。先说一下,移位运算有两种,一种叫算术移位运算符,一种叫逻辑移位运算符,这俩唯一的差距就是逻辑右移最高位补0,算术右移是最高位补符号位,一般大家也不怎么接触汇编~~一般的比汇编高级点的语言里的">>"和“<<”都是算术移位而非逻辑移位。首先正数左移右移都可以,左移n位相当于乘了一...
移位运算,移位操作应用
一、位运算应用口诀      清零取位要用与,某位置一可用或      若要取反和交换,轻轻松松用异或   二、移位运算     1、它们都是双目运算符,两个运算分量都是整形,结果也是整形。     2、"     3、">>"右移:右边的位被挤掉。对于左边移出的空位,如果是正数则空位补0,若为负数,可能补0或补1,这取决于所用的计算机系统,其值相当于除以2。     4、">>>
最大的奇约数和
小易是一个数论爱好者,并且对于一个数的奇数约数十分感兴趣。一天小易遇到这样一个问题: 定义函数f(x)为x最大的奇数约数,x为正整数。 例如:f(44) = 11.现在给出一个N,需要求出 f(1) + f(2) + f(3).......f(N) 例如: N = 7  f(1) + f(2) + f(3) + f(4) + f(5) + f(6) + f(7) = 1 + 1 + 3 +
Java移位运算
java移位运算符不外乎就这三种:>(带符号右移)和>>>(无符号右移)。  1、 左移运算符 左移运算符 1)它的通用格式如下所示: value num 指定要移位值value 移动的位数。 左移的规则只记住一点:丢弃最高位,0补最低位 如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模。如对int型移动33位,实际上只移动了332=1位。 2)运算规则
计算机组成带移位运算实验报告
计算机组成原理实验,实现函数的时间复杂度分析,思考和小结等,构成完整的实验报告