V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
zhongshaohua
V2EX  ›  Linux

关于宏定义的安全性,下面为什么会输出- 1?

  •  
  •   zhongshaohua · 2016-06-12 22:54:08 +08:00 · 2419 次点击
    这是一个创建于 3089 天前的主题,其中的信息可能已经有所发展或是发生改变。
    #define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]))

    int fun(void)
    {
    int array[] = {1, 2, 3, 4, 5};

    if ((ARRAY_SIZE(array) - 2) > -1) {
    /* xxx */
    return 0;
    }

    return -1;
    }
    5 条回复    2016-08-13 21:29:52 +08:00
    sen506
        1
    sen506  
       2016-06-12 23:28:13 +08:00 via Android   ❤️ 1
    int 转成 uint 去运算了,,
    azh7138m
        2
    azh7138m  
       2016-06-12 23:31:35 +08:00 via Android
    楼上正解, sizeof 返回的是无符号数,运算符两边存在无符号数的时候就会把带符号数转换为无符号数
    htfy96
        3
    htfy96  
       2016-06-12 23:52:02 +08:00
    因为 ARRAY_SIZE(array)-2 是 unsigned long ,比-1 的 int 阶高,所以 int 会被转成 unsigned long
    zhongshaohua
        4
    zhongshaohua  
    OP
       2016-06-13 12:05:17 +08:00
    感谢楼上各位老司机
    liashui
        5
    liashui  
       2016-08-13 21:29:52 +08:00
    If both operands have the same type, then no further conversion is needed.
    Otherwise, if both operands have signed integer types or both have unsigned
    integer types, the operand with the type of lesser integer conversion rank is
    converted to the type of the operand with greater rank.
    Otherwise, if the operand that has unsigned integer type has rank greater or
    equal to the rank of the type of the other operand, then the operand with
    signed integer type is converted to the type of the operand with unsigned
    integer type.
    Otherwise, if the type of the operand with signed integer type can represent
    all of the values of the type of the operand with unsigned integer type, then
    the operand with unsigned integer type is converted to the type of the
    operand with signed integer type.
    Otherwise, both operands are converted to the unsigned integer type
    corresponding to the type of the operand with signed integer type.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3366 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 11:35 · PVG 19:35 · LAX 03:35 · JFK 06:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.