2<<1024>>1024 不越界么?

castlooo 2009-01-16 11:29:38
ShowMessage(2<<1024>>1024);
结果还是2
整型移位 不会超出界么? int不是占32位么?
...全文
264 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
lbh2001 2009-01-16
  • 打赏
  • 举报
回复
根据C标准,左移或右移超过类型所占内存的位数,那么结果是undefined的
各个编译器都可以自由决定如何处理,在这个编译器下是这个结果,在别的编译器下很可能是另一个结果
undefined的东西,谁知道呢,没有标准答案
叶落寒山 2009-01-16
  • 打赏
  • 举报
回复

i = 1<<64; //0
i = 1<<128;//0
i = 1<<256;//1
i = 1<<512;//1

问题没那么简单,256、512可以理解为忽略掉了。但是64、128怎么解释呢。左移还是起作用了。

不过我前面说是循环位移,也错了。这里不是循环位移。

nineforever 2009-01-16
  • 打赏
  • 举报
回复
如果左移或右移超过类型的位数,那么结果是undefined的
lbh2001 2009-01-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 castlooo 的回复:]
C/C++ code int i = 2<<1024;
ShowMessage(i);
i= i>>1024;
ShowMessage(i);
//只是警告,结果都是2,why?
[C++ Warning] test.cpp(200): W8055 Possible overflow in shift operation
[C++ Warning] test.cpp(200): W8055 Possible overflow in shift operation
[/Quote]

你看反汇编的代码,你的移位数太大,被编译器直接忽略掉了
我的VC++6.0的情况是

int i = (2 << 1024);
00401028 mov dword ptr [ebp-4],2
90: printf("%d\n", i);
0040102F mov eax,dword ptr [ebp-4]
00401032 push eax
00401033 push offset string "%d\n" (0042201c)
00401038 call printf (00401090)
0040103D add esp,8
91: i = (i >> 1024);
00401040 mov ecx,dword ptr [ebp-4]
00401043 sar ecx,0
00401046 mov dword ptr [ebp-4],ecx
92: printf("%d\n", i);
00401049 mov edx,dword ptr [ebp-4]
0040104C push edx
0040104D push offset string "%d\n" (0042201c)
00401052 call printf (00401090)
00401057 add esp,8
93:
叶落寒山 2009-01-16
  • 打赏
  • 举报
回复
或者是当左移的位数超过该类型的最大位数时,用左移的位数去模该类型的最大位数。然后取余数进行移位。
可以做个试验程序来试验一下。
castlooo 2009-01-16
  • 打赏
  • 举报
回复
    int i = 2<<1024;
ShowMessage(i);
i= i>>1024;
ShowMessage(i);
//只是警告,结果都是2,why?
[C++ Warning] test.cpp(200): W8055 Possible overflow in shift operation
[C++ Warning] test.cpp(200): W8055 Possible overflow in shift operation
lbh2001 2009-01-16
  • 打赏
  • 举报
回复
目前还没有什么数据类型有1024位这么长吧
按标准,移位不能大于等于操作数的二进制位数
你这样写编译器至少会产生警告
叶落寒山 2009-01-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yujian596 的回复:]
ShowMessage(2 < <1024);
先试这个。。
[/Quote]

结果还是 2。
感觉是被编译器优化了,是循环移位。从最高位移除的循环放入最低位。
yujian596 2009-01-16
  • 打赏
  • 举报
回复
ShowMessage(2 < <1024);
先试这个。。
yellowhwb 2009-01-16
  • 打赏
  • 举报
回复
估计是被编译器给优化了
int i=2<<1024>>1024;
此时编译器可能会把>>,<<的数字相互抵消,得到2!
xiaoyisnail 2009-01-16
  • 打赏
  • 举报
回复

ShowMessage(2<<32>>32);
叶落寒山 2009-01-16
  • 打赏
  • 举报
回复
测试结果。

int i;

i = 1<<1; // 2
i = 1<<30; // 0x40000000
i = 1<<31; // 0x80000000

i = 1<<32;//0

i = 1<<64;//0
i = 1<<65;//0
i = 1<<66;//0

i = 1<<128;//0
i = 1<<129;//0
i = 1<<130;//0

i = 1<<256;//1
i = 1<<257;//2
i = 1<<258;//4

i = 1<<512;//1
i = 1<<513;//2
i = 1<<514;//4

i = 1<<1024;//1
i = 1<<1025;//2
i = 1<<1026;//4


小于整型的位数32时,符合正常的左移操作。
大于32,小于256时,按溢出处理。
大于256时,又按 模256后,余数进行左移。

不明白为何以256为界限。呵呵,有兴趣的朋友可以再深入研究。不过,我觉得这样位移没什么现实意义。在实际编程时
谁也不会这么用吧。
jia_xiaoxin 2009-01-16
  • 打赏
  • 举报
回复
这跟计算机所能表示的最大值有关
2 << x;
如果x < 31, 可以正确表示
x < 256, 返回0
x >= 256 忽略
castlooo 2009-01-16
  • 打赏
  • 举报
回复
明白了 谢谢

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧