+ -
当前位置:首页 → 问答吧 → 大家看看这个位运算怎么回事

大家看看这个位运算怎么回事

时间:2010-07-26

来源:互联网

最近在看C语言。一本书上有这么个题:
int i = 0xcffffff3;
printf("%x\n", 0xcffffff3>>2);
printf("%x\n", i>>2);
结果为什么不同?

我运行了看结果分别为:
33fffffc
fffffffc

第一个的是符合规则的。1100 1111 1111 1111 1111 1111 1111 0011移位后为
                                 0011 0011 1111 1111 1111 1111 1111 1100
也就是33fffffc
但是第二个我认为应该是int存值的时候溢出造成的。在X86里int是32位。最高位算为符号位的话(1负数)。右移时高位移入1。那么按道理也应该是
1111 0011 1111 1111 1111 1111 1111 1100
也不应该是fffffffc啊?
请问大家这个是这么算出来的呢?
在下现谢谢各位了!

作者: beatlefuns   发布时间: 2010-07-26

你的是什么平台  

  我的是ubuntu 9.04 gcc 4.3.3  平台是 i386

   按照你的代码   我的结果是:
(1)  printf("%x\n",0xcffffff3>>2);
:   33fffffc
(2) i=0xcffffff3
printf("%x\n",i>>2);
:  f3fffffc

  第一个的结果是gcc帮算的 用了shr指令  把0xcffffff3当成unsigned int 了
         .loc 1 17 0
50         movl    -8(%ebp), %eax
51         movl    $100, (%eax)
52         .loc 1 18 0
53         movl    $-805306381, -12(%ebp)
54         .loc 1 19 0
55         movl    $872415228, 4(%esp)
56         movl    $.LC0, (%esp)
57         call    printf
58         .loc 1 20 0

  第二个的结果   gcc侦测到类型了  所以用sarl指令
59         movl    -12(%ebp), %eax
60         sarl    $2, %eax
61         movl    %eax, 4(%esp)
62         movl    $.LC0, (%esp)
63         call    printf
64         .loc 1 21 0




  你的那个结果就不清楚了

作者: land5280   发布时间: 2010-07-26

相关阅读 更多