免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: syoubin_sai
打印 上一主题 下一主题

[C] 请教C语言牛人----关于int与unsigned int的奇怪问题 [复制链接]

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
41 [报告]
发表于 2010-06-13 06:38 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
42 [报告]
发表于 2010-06-13 06:43 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
43 [报告]
发表于 2010-06-13 07:40 |只看该作者
只有论点,没有论据,外加点粗话,你这也叫轰?大概你把放空炮也算做轰,其实那最多属于自慰而已。
  ...
pmerofc 发表于 2010-06-13 06:38


很佩服你的汉语功底,天天胡乱说话不会是为了混积分吧!
CU级别高不一定水平高!
高水平的人是要对自己说的话负责的。而不是随便拿出点名词糊弄新人!
我最近很忙,话虽然简单,确实对新人诚恳的建议!
而不是为了装逼而不管别人死活!
况且是你先惹我的吧!还出言不逊!
成长阶段低调些好,别拿无知当勇气,不要太勇于表达自己无知的部分,以免误人子弟,误己前程。

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
44 [报告]
发表于 2010-06-13 08:59 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
45 [报告]
发表于 2010-06-13 09:58 |只看该作者
本帖最后由 guoruimin 于 2010-06-13 11:04 编辑

只顾掐架了,没帮上楼主什么忙,实在惭愧。

楼主的第三段代码是正确无误的,除了有点小警告。如果不能输出OK,就是编译器的bug了。
在我的系统:
Target: x86_64-linux-gnu
gcc version 4.3.2 (Debian 4.3.2-1.1)
是会输出OK的。


这段程序归根结底是 无符号整数0x80000000 与 无符号整数0x7FFFFFFF 的比较。
显而易见是应该输出OK的。
在上面汇编代码中:

mov  -0x4(%rbp), %eax
add  $0x1, %eax
是将 last_jobid 的值存入寄存器 eax,然后加 1。

test %eax, %eax
jns  0x4005c7 <main+75>
是判断 eax 的值是否为负数?
这里其实是一个技巧,本质上是判断 eax 的最高位是否为 1?
因为负数的最高位为 1,0 和正数的最高位为 0;
但咱们这里是无符号数的比较,所以就无正负之分了;
最高位为 1 的肯定大于最高位为 0 的。

0x7FFFFFFF 的最高位为 0,它是最大的 int,也是最高位为 0 的最大的 unsigned int;
0x80000000 的最高位为 1,它是最小的 int,也是最高位为 1 的最小的 unsigned int;
0x80000000 ~ 0xFFFFFFFF 的最高位都为 1,所以作为无符号数都是大于 0x7FFFFFFF 的。
所以就不必用 cmp 指令将 eax 中的值和 0x7FFFFFFF 比较了,直接用 test %eax, %eax 然后 jns 应该效率更高!

对于 jns(非负即最高位为 0 则跳转)指令,eax 中的值 0x80000000 显然是不符合条件的,
所以要继续向下执行,输出 “OK”!

论坛徽章:
0
46 [报告]
发表于 2010-06-13 15:07 |只看该作者
最后一个就不应该有OK的吧

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
47 [报告]
发表于 2010-06-13 15:41 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
48 [报告]
发表于 2010-06-13 16:40 |只看该作者
看来这个跟编译器有关了

论坛徽章:
0
49 [报告]
发表于 2010-06-13 16:40 |只看该作者
本帖最后由 guoruimin 于 2010-06-13 17:00 编辑

原来:
int i = 0x7FFFFFFF;
i++;
i 的值就成 “未定义行为” 了?
这个名词还是不要用在这里为好吧!
我相信任何一个有经验的 C 程序员,都可以判定出此时 i 的值。

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
50 [报告]
发表于 2010-06-13 17:19 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP