免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
11 [报告]
发表于 2010-06-10 17:41 |只看该作者

  1. printf("%d \n",id);
  2. printf("%d \n", id+);

  3. printf("%0x \n", id);
  4. printf("%0x \n", id+1);
复制代码



ubuntu - 10.04 - 32bit

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
12 [报告]
发表于 2010-06-10 17:46 |只看该作者
我记得int和unsigned int相比较,转成int再比。
看这个结果,貌似我记错了。{:3_183:}

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-05-27 06:20:00
13 [报告]
发表于 2010-06-10 17:48 |只看该作者
我是32位的机器

        if (last_jobid+1 > (unsigned int)INT_MAX) {
                printf("ok\n");
应该是编译器的原因 我用gcc就没输出ok
用dev c++就输出了。。。


请教下达人,按照ansi c的标准, 对于 if (last_jobid+1 > (unsigned int)INT_MAX) ,是不是左边的last_jobid+1会别转为unsigned,故左边大于右边???

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

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
15 [报告]
发表于 2010-06-10 17:53 |只看该作者
回复 14# pmerofc

是不是只有这样写才是有良好定义的?

  1. if ( (unsigned)last + 1 > /*(unsigned) 可省略*/ INT_MAX )
复制代码

论坛徽章:
0
16 [报告]
发表于 2010-06-10 17:57 |只看该作者
附64位GCC环境下的汇编代码,麻烦各位高手帮分析下。
  1.         .file   "rtn.c"
  2.         .section        .rodata
  3. .LC0:
  4.         .string "ok"
  5.         .text
  6. .globl main
  7.         .type   main, @function
  8. main:
  9. .LFB5:
  10.         pushq   %rbp
  11. .LCFI0:
  12.         movq    %rsp, %rbp
  13. .LCFI1:
  14.         subq    $16, %rsp
  15. .LCFI2:
  16.         movl    $2147483647, -4(%rbp)
  17.         cmpl    $-1, -4(%rbp)
  18.         jge     .L2
  19.         movl    $.LC0, %edi
  20.         call    puts
  21. .L2:
  22.         movl    $0, %eax
  23.         leave
  24.         ret
  25. .LFE5:
  26.         .size   main, .-main
  27.         .section        .eh_frame,"a",@progbits
  28. .Lframe1:
  29.         .long   .LECIE1-.LSCIE1
  30. .LSCIE1:
  31.         .long   0x0
  32.         .byte   0x1
  33.         .string "zR"
  34.         .uleb128 0x1
  35.         .sleb128 -8
  36.         .byte   0x10
  37.         .uleb128 0x1
  38.         .byte   0x3
  39.         .byte   0xc
  40.         .uleb128 0x7
  41.         .uleb128 0x8
  42.         .byte   0x90
  43.         .uleb128 0x1
  44.         .align 8
  45. .LECIE1:
  46. .LSFDE1:
  47.         .long   .LEFDE1-.LASFDE1
  48. .LASFDE1:
  49.         .long   .LASFDE1-.Lframe1
  50.         .long   .LFB5
  51.         .long   .LFE5-.LFB5
  52.         .uleb128 0x0
  53.         .byte   0x4
  54.         .long   .LCFI0-.LFB5
  55.         .byte   0xe
  56.         .uleb128 0x10
  57.         .byte   0x86
  58.         .uleb128 0x2
  59.         .byte   0x4
  60.         .long   .LCFI1-.LCFI0
  61.         .byte   0xd
  62.         .uleb128 0x6
  63.         .align 8
  64. .LEFDE1:
  65.         .ident  "GCC: (GNU) 4.1.2 20071124 (Red Hat 4.1.2-42)"
  66.         .section        .note.GNU-stack,"",@progbits
复制代码

论坛徽章:
0
17 [报告]
发表于 2010-06-10 17:58 |只看该作者
last_jobid+1
已经是未定义行为了
pmerofc 发表于 2010-06-10 17:48

能详细解释下吗?

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
18 [报告]
发表于 2010-06-10 18:26 |只看该作者
last_jobid+1
已经是未定义行为了
pmerofc 发表于 2010-06-10 17:48



    翻了一遍n1124,实在是没发现哪儿有写未定义行为,能给点提示么……

论坛徽章:
0
19 [报告]
发表于 2010-06-10 19:02 |只看该作者
GCC 4.5.0 x86_64下,第一个程序可以出OK,你的GCC是多少版本的?

  1. $ cat a64.c
  2. #include <stdio.h>
  3. #include <limits.h>
  4. int main ()
  5. {
  6.         int last_jobid = INT_MAX;

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

  9.         if (last_jobid+1 > (unsigned int)INT_MAX) {
  10.                 printf("ok\n");
  11.         }
  12.         return 0;
  13. }
  14. $ gcc -o a64 a64.c
  15. a64.c: 在函数‘main’中:
  16. a64.c:8:33: 警告:整数溢出
  17. $ ./a64
  18. 7fffffff
  19. 80000000
  20. ok
  21. $
复制代码

论坛徽章:
0
20 [报告]
发表于 2010-06-10 19:05 |只看该作者
movl    $2147483647, -4(%rbp)
        cmpl    $-1, -4(%rbp)
        jge     .L2
汇编里面last_jobid+1被直接优化成-1了,GCC 4.5.0生成的代码这里是:
       movl    -4(%rbp), %eax
        addl    $1, %eax
        testl   %eax, %eax
        jns     .L2
做了+1,所以是结果对的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP