【问题标题】:Why GCC long long int can't do 1<<48 but gets an overflow warning为什么 GCC long long int 不能执行 1<<48 但会收到溢出警告
【发布时间】:2022-01-04 05:41:54
【问题描述】:
{
    unsigned long long two16, two48 ;
    two16 = 65536;
    two48 = two16 * two16 * two16 ; 
    printf("2^48=%llX \n",two48 );
    two48 = 1<<48 ;
    printf("Shifted 1<<48=%llX \n",two48);
    return 0 ;
}

在 64 位机器上编译时,字长为 8,上面给出了一个警告 two=1= 类型宽度。

程序的输出是:

    2^48=1000000000000  
    Shifted 1<<48=0

发生了什么事?为什么我不能将 64 位的数量移动 48 位?

【问题讨论】:

  • 一个表达式获取该表达式使用的操作数的类型,不是在不同的(子)表达式中使用的某种类型。 1int 类型,所以这就是执行班次的原因。将这种有符号整数左移超过 31 位是未定义的行为。 切勿在 C 程序中键入 1&lt;&lt; ...!它永远是不正确的。它应该始终是 1U1UL 等或转换为无符号类型的东西。

标签: c integer-overflow gcc-warning


【解决方案1】:

为什么我不能将 64 位的数量移动 48 位?

没有将 64 位整数移位 48。您正在将 32 位整数 (1) 移位 48,并将(溢出的)结果分配给 64 位整数。试试这个:

two48 = 1ULL << 48;

或者这个:

two48 = 1;
two48 = two48 << 48;

【讨论】:

    猜你喜欢
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多