代码之家  ›  专栏  ›  技术社区  ›  Geremia

1<<31不能用“int”类型表示吗?

  •  2
  • Geremia  · 技术社区  · 6 年前

    -fsanitize=undefined

    运行时错误:1乘31位的左移位不能在类型“int”中表示

    关于这个代码

    uint32_t z;
    z = 1 << 31;
    

    2 回复  |  直到 4 年前
        1
  •  9
  •   Geremia    6 年前

    uint32_t z;
    z = UINT32_C(1) << 31;
    
        2
  •  5
  •   Keith Thompson    4 年前

    因为1乘31位的左移不能在类型中表示 int .

    1 << 31 是2 31 2147483648 INT_MAX 在典型系统上(其中 int 2147483647 . 如果有符号类型上的算术运算溢出(产生类型结果之外的结果),则行为未定义。(不要以为它会绕过去。可能会,但语言不能保证。)

    unsigned long long long 保证有那么宽。(语言不能保证这一点 int 宽度超过16位,但在大多数系统上可能是32位。)