超级怪问题,不得不看。(醒目!!!!!!)

diabloqin 2003-05-17 11:34:34
下面这段程序输出的结果不为0,这怎么可能??


# include <iostream.h>

void main()
{
int i = 1;
cout << (i << 50);
}
...全文
44 19 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
不会吧? 循环移位????
  • 打赏
  • 举报
回复
对,因为它又自动转回来了,这叫什么来着,我忘了:)
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。

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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