为什么用shl会出来负数?
noip吧
全部回复
仅看楼主
level 7
风濑 楼主
rt
弱弱的问一下
2012年10月17日 12点10分 1
level 11
爆掉了,就是太大了,超过了定义的类型的范围。比如定义了a是int(ger)然后a:=1 shl 100000000000000000000000000;结果a就有可能是负的
2012年10月17日 12点10分 2
这不一定,在integer下1左移一个大于15的数就一直是0,详情参见楼下(溢出的位舍去)。。(吐槽一下,100....0那个数怎么存。。)
2012年10月17日 13点10分
回复 RexSkz :这不是夸张便于说明吗...
2012年10月17日 13点10分
回复 Agosits :(但不能太夸张了吧。。)平常说的“爆掉了”只是最终结果最高位是1(不排除是0的可能)而已。。系统做运算才不管你正负呢,只按照二进制来算。。1左移这么大一个数之后二进制每一位都是0了,这个数也就是0了。。
2012年10月17日 13点10分
回复 RexSkz :呃..我研究不深,就知道爆多了就成负的了
2012年10月17日 13点10分
level 8
var a:integer;
begin
a:=1; //(1)
a:=a<<15; //(2)
writeln(a);
end.
执行(1)后,a=1,也就是00000000 00000001
执行(2)后,a左移变成了10000000 00000000
左移15位,就是把这个数后面添了15个0,溢出的位舍去。
而这个数(别忘了integer第一位是符号位)在十进制中是-32768。
2012年10月17日 13点10分 3
补充一点,首先得是带符号整数(所以qword(或unsigned long long)就不行了),其次左移之后最高位也就是符号位只要是1,结果就是复数。。
2012年10月17日 13点10分
回复 RexSkz :谢谢
2012年10月17日 13点10分
1