免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 34520 | 回复: 120
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-06-10 16:39 |只看该作者 |倒序浏览
本帖最后由 syoubin_sai 于 2010-06-10 16:43 编辑

在64位系统下运行。

有如下代码:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <assert.h>
  4. #include <limits.h>
  5. int main ()
  6. {
  7.         int last_jobid = INT_MAX;

  8.         printf ("%0x\n", INT_MAX);
  9.         printf ("%0x\n", INT_MAX+1);

  10.         if (last_jobid+1 > (unsigned int)INT_MAX) {
  11.                 printf("ok\n");
  12.         }
  13.         return 0;
  14. }
复制代码
结果为:
  1. 7fffffff
  2. 80000000
复制代码
上面代码中if 语句判断前last_jobid+1 不是要隐式转换成unsigned int吧?
为什么不输出ok呢?
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <assert.h>
  4. #include <limits.h>
  5. int main ()
  6. {
  7.         unsigned int last_jobid = INT_MAX;

  8.         printf ("%0x\n", INT_MAX);
  9.         printf ("%0x\n", INT_MAX+1);

  10.         if (last_jobid+1 > (unsigned int)INT_MAX) {
  11.                 printf("ok\n");
  12.         }
  13.         return 0;
  14. }
  15. 这个是正确的
复制代码
结果为:
  1. 7fffffff
  2. 80000000
  3. ok
复制代码
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <assert.h>
  4. #include <limits.h>
  5. int main ()
  6. {
  7.         int last_jobid = INT_MAX;

  8.         printf ("%0x\n", INT_MAX);
  9.         printf ("%0x\n", INT_MAX+1);

  10.         if ((unsigned int)(last_jobid+1) > (unsigned int)INT_MAX) {
  11.                 printf("ok\n");
  12.         }
  13.         return 0;
  14. }

  15. 这里我自己强制转换了下怎么不对呢?
  16. 应该输出ok吧?
复制代码
结果为:
7fffffff
80000000

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
2 [报告]
发表于 2010-06-10 16:45 |只看该作者
最后一个没有输出ok?

论坛徽章:
0
3 [报告]
发表于 2010-06-10 16:46 |只看该作者
回复 2# OwnWaterloo


    没呢{:3_185:}

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

为啥我有?
kernel@fairland:~/tmp$ cc b.c -o b -Wall
b.c: In function ‘main’:
b.c:11: warning: integer overflow in expression
kernel@fairland:~/tmp$ ./b
7fffffff
80000000
ok



32位机器是有的,64位的确实没有

论坛徽章:
0
5 [报告]
发表于 2010-06-10 16:58 |只看该作者
为啥我有?
churchmice 发表于 2010-06-10 16:56



  怪了 那第一个有吗?

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
6 [报告]
发表于 2010-06-10 17:01 |只看该作者
我在64位Linux也是没有输出ok,改成
if ((unsigned int)last_jobid+1 > (unsigned int)INT_MAX)
就有输出ok了。

看来要看看生成的汇编代码了

论坛徽章:
0
7 [报告]
发表于 2010-06-10 17:03 |只看该作者
回复 5# syoubin_sai


    32位机器两个都有,64位机器两个都没有

论坛徽章:
0
8 [报告]
发表于 2010-06-10 17:08 |只看该作者
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <assert.h>
  4. #include <limits.h>
  5. int main ()
  6. {
  7.         int last_jobid = 4294967294;

  8.         printf ("%0x\n", INT_MAX);
  9.         printf ("%0x\n", last_jobid);
  10.         printf ("%0x\n", INT_MAX+1);

  11.         if (last_jobid+1 > (unsigned int)INT_MAX) {
  12.                 printf("ok\n");
  13.         }
  14.         return 0;
  15. }
复制代码
7fffffff
fffffffe
80000000
ok
这个是OK的{:3_203:}

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
9 [报告]
发表于 2010-06-10 17:09 |只看该作者
本帖最后由 hellioncu 于 2010-06-10 17:14 编辑
回复  syoubin_sai


    32位机器两个都有,64位机器两个都没有
churchmice 发表于 2010-06-10 17:03



    我用HP 的 aCC试了,64位也输出ok

   AIX 的 xlc也试了,64位也输出ok

论坛徽章:
0
10 [报告]
发表于 2010-06-10 17:38 |只看该作者
{:3_199:} 依然很迷惑
我用HP 的 aCC试了,64位也输出ok

   AIX 的 xlc也试了,64位也输出ok
hellioncu 发表于 2010-06-10 17:09
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP