社区
C语言
帖子详情
超级怪问题,不得不看。(醒目!!!!!!)
diabloqin
2003-05-17 11:34:34
下面这段程序输出的结果不为0,这怎么可能??
# include <iostream.h>
void main()
{
int i = 1;
cout << (i << 50);
}
...全文
44
19
打赏
收藏
超级怪问题,不得不看。(醒目!!!!!!)
下面这段程序输出的结果不为0,这怎么可能?? # include void main() { int i = 1; cout << (i << 50); }
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
19 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
BeZyzz
2003-05-21
打赏
举报
回复
28: 268435456
29: 536870912
30: 1073741824
31: -2147483648
32: 1
33: 2
34: 4
35: 8
这是我的结果
第30次是010000000,00000000,00000000,0000000
31次是10000000,00000000,00000000,00000000
32次则是00000000,00000000,00000000,00000001
数据发生了循环,50次如此,150次也是如此
不过内部的细节问题还请高手们指教
.....我觉得这个特点可以有一个不错的应用,比如做一些特别的循环处理啊等等
greysky_xu
2003-05-20
打赏
举报
回复
应为越界了,int 是32位的,左移50次超过了范围,溢出了。
可用如下的代码证明:
# include <iostream.h>
void main()
{
int i = 1,j;
for(j = 1;j <= 50 ; j++)
{
cout << (i << j)<<" ";
}
}
chinajiji
2003-05-20
打赏
举报
回复
The results are undefined if the right operand of a shift expression is negative or if the right operand is greater than or equal to the number of bits in the (promoted) left operand.
无意义的操作总是undefined.
river_of_sky
2003-05-20
打赏
举报
回复
用的VC吗?用
#include <iostream>
using namespace std;
int main( )
{
int i = 0;
while ( 1 ) {
cout << ( i += 60000 ) << endl;
}
return 0;
}
测试一下,vc支持到多大的int就知道了:) 绝对不支持iso c++的行为哦
David2008
2003-05-20
打赏
举报
回复
# include <iostream.h>
void main()
{
int i = 1,j;
for(j = 1;j <= 50 ; j++)
{
cout << (i << j)<<" ";
}
}
这个程序很能说明问题
我在vc6.0下试过了
看来在31位就出问题了
30次是: 11111111 11111111 11111111 11111111
31次是: 10000000 00000000 00000000 00000000
32次是:1 00000000 00000000 00000000 00000000
(第32次之后1 被丢弃了)
道理很简单了
snipersu
2003-05-20
打赏
举报
回复
循环的.
^_^
dragoncircle
2003-05-20
打赏
举报
回复
是循环移位,用
int i=1;
cout<<(i<<32)<<endl;
结果输出的是1,因为i是32位整型,所以移了32位后又变回原来的数了,我在vc6.0上测试的结果
大道如海
2003-05-20
打赏
举报
回复
代码:
int i = 1;
cout << (i << 63) << endl;
cout << (i << 31) << endl;
结果:
-2147483648
-2147483648
我觉得是循环移位
出现负号是因为1被移在了符号位上的原因
icansaymyabc
2003-05-20
打赏
举报
回复
i << 50 被翻译成 shl <reg>,32h
shl 是循环位移指令
ZZH1983(ZZH) 的说法不成立,32位机里对 char 型的运算也是在 32 位寄存器里完成的,遵循32位法则。
Zark
2003-05-20
打赏
举报
回复
越界了.
错误是由CPU造成的.其指令是
shl eax,32H
ZZH1983
2003-05-20
打赏
举报
回复
好象不是循环的。
是越界了。
char i = 1;
cout<< (i << 9)<<endl;
output:
512
diabloqin
2003-05-19
打赏
举报
回复
to greening
但是输出结果不是0亚?不信试试看。
Honey_boy
2003-05-18
打赏
举报
回复
zolas(小鱼儿)
这位兄弟对问题得理解有误呀。
现在我们的机器一般都是32位,
刚才我在vc++6.0上运行了一下这个程序,
发现
int i = 1;
cout << (i << 31);
就不对了。
估计应该是越界得问题吧。
DanielWYO
2003-05-18
打赏
举报
回复
这个应该超越了C++的限制了吧.
C++规定应该不会出现这种问题的.
greening
2003-05-18
打赏
举报
回复
<< 左移操作符从右边开始用0补位,而左边移到外面的数位将会被抛弃。在32位情况下,1 << 50 在左移32次后就是0了,因为唯一的“1”也被抛弃了。
Caoyu015
2003-05-18
打赏
举报
回复
不会吧? 循环移位????
小笨和漂向北方
2003-05-18
打赏
举报
回复
对,因为它又自动转回来了,这叫什么来着,我忘了:)
Peterwby
2003-05-18
打赏
举报
回复
i<<32 == 1
i<<33 == 2
i<<34 == 4
....
好像会一直循环下去
zolas
2003-05-17
打赏
举报
回复
cout << ( i<50 ); ?????
i<<50=1*2^50不是0。
生意精:说说如何开好一家小超市!
我觉得我自己就是一个科学家(超市科学家),我想我这样的水平,如果不带几个徒弟出来,就好比古代华佗没有留下医术一样遗憾 华夏 千古!" J9 n) M$ a3 r1 z6 X * z/ ]# h E8 K! _6 @ j/ z 要是开好一家小超市...
开车人千金难买的知识!(组图)
开车一族赶紧收着吧,下面这些都是
超级
有用的知识: 遮阳板可以向侧面转 遮阳板大家一定不陌生,当我们迎着阳光开车的时候,可以放下遮阳板,来阻挡太阳光对我们的影响。 也许很多朋友不知道,遮阳板是可以向侧面...
互联网最全黑话宝典
还在为报告上的奇奇
怪
怪
的专业术语而发愁吗?今天总结了最全最黑的互联网黑话宝典看完之后再也不用担心啦!文章收好不谢~职位名称PM:互联网产品经理,是互联网公司中的一种职能,负责互联网产品的计划和推广,以及...
GIS专业就业之职业态度——转:职场人必看 十句话让您在职场少奋斗30年
GIS大讨论(十):GIS专业就业之职业态度——转:职场人必看 十句话让您在职场少奋斗30年 粟卫民 http://www.gisdev.cn/ http://blog.csdn.net/suen/ 日期:2012-4-1 保留所有版权。如需转载,请联系作者,...
GIS大讨论(十):GIS专业就业之职业态度——转:职场人必看 十句话让您在职场少奋斗30年
GIS大讨论(十):GIS专业就业之职业态度——转:职场人必看 十句话让您在职场少奋斗30年 粟卫民 http://www.gisdev.cn/ http://blog.csdn.net/suen/ 日期:2012-4-1 保留所有版权。如需转载,请联系作者,并在...
C语言
69,369
社区成员
243,082
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章