C++移位运算符
来源:互联网 发布:linux dhcp服务配置 编辑:程序博客网 时间:2024/06/04 19:42
关于逻辑移位、算术移位可参见迅雷深大笔试题部分。的一道题。
以前看到C++标准上说,移位运算符(<<、>>)出界时的行为并不确定:
The behavior is undefined if the right operand is negative, orgreater than or equal to the length in bits of the promoted left operand.
我当时也没有深究过这个问题。前几天有个网友来信问起这件事,我才发现,这和IntelCPU的移位运算有关。下面是那位网友的来信以及我的回复:
您好!运算符<<作为位操作中的高效的操作,但我遇到一个问题:下面在VC环境下发现一个很不明白的地方,下面标注。
#include <stdio.h>
void main()
{
unsigned int i,j;
i=35;
//为什么下面两个左移操作结果不一样?
j=1<<i; // j为8
j=1<<35; // j为0
}
不知是哪里没有理解对。
原因是这样的:i=35;j=1<<i;这两句在VC没有做优化的情况下,将被编译成下面的机器指令:
mov dword ptr [i],23h
mov eax,1
mov ecx,dword ptr [i]
shl eax,cl
mov dword ptr [j],eax
在shl一句中,eax=1,cl=35。而IntelCPU执行shl指令时,会先将cl与31进行and操作,以限制左移的次数小于等于31。因为35 & 31 =3,所以这样的指令相当于将1左移3位,结果是8。
而j=1<<35;一句是常数运算,VC即使不做优化,编译器也会直接计算1<<35的结果。VC编译器发现35大于31时,就会直接将结果设置为0。这行代码编译产生的机器指令是:
mov dword ptr [j],0
对上面这两种情况,如果把VC编译器的优化开关打开(比如编译成Release版本),编译器都会直接将结果设置为0。
所以,在C/C++语言中,移位操作不要超过界限,否则,结果是不可预期的。
所以如下的表达式结果为:
注意: 这种表达式本身就是不合法的。它会出现什么结果也是未定义的。所以取决于编译器。
- c中的移位运算符
- C语音移位运算符
- C语言移位运算符
- C语言移位运算符
- C语言移位运算符
- C语言移位运算符
- C/C++移位运算符
- C语言移位运算符精度问题
- C语言的移位运算符
- c语言中的移位运算符
- C中的移位运算
- C中的移位运算
- C/C++移位运算
- 【C语言】移位运算符、位运算符、逻辑运算符
- Objective-C位运算符-向左移位运算符
- Objective-C位运算符-向右移位运算符
- C语言的移位运算
- C/C++中的移位运算
- 服务器容错保护(Hystrix依赖隔离)
- 哈希表C开源的uthash的简单初步封装(二)
- 个人开发者如何通过人工智能盈利?智能原理及阿尔法狗详解
- MM 委外加工(Subconctracting)流程
- Java中四种代码块的区别
- C++移位运算符
- CentOS 7 修改主机名
- 安装单节点的zookeeper
- GDAL+VS2010
- 排列组合(c/python)
- 【实例讲解】DS18B20 ROM码的搜索算法
- 版本兼容
- 论文阅读:Fixing Weight Decay Regularization in Adam
- 晚安