大家看看这个位运算怎么回事
时间: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啊?
请问大家这个是这么算出来的呢?
在下现谢谢各位了!
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
你的那个结果就不清楚了
我的是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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28