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

左换档(带单元64)-发出警告

c++
  •  2
  • Rajeshwar  · 技术社区  · 8 年前

    uint64_t x = (1 << 46); 
    std::cout << x;
    

    -警告:left shift count>=类型的宽度[-Wshift count overflow]

    1 0000........00 (46 0s) 
    

    我的问题是为什么我会收到这个警告?不是64位的uint64吗?为什么我要得到输出0?

    2 回复  |  直到 8 年前
        1
  •  6
  •   Sergey Kalinichenko    8 年前

    问题是您没有移动64位常量: 1 是类型的常量 int ,它在您的平台上小于64位(可能是32位;它是由实现定义的)。

    UINT64_C 常量周围的宏:

    uint64_t x = (UINT64_C(1) << 46); 
    
        2
  •  1
  •   Mischa    8 年前

    1是32位常量。编译器(正确地)将常量表达式计算为0,即超出int32大小的1。如果<<的参数是变量,x86 cpu将返回(1<<14),即.1和lt;<(46%32)。