左转与GCC严重错误

时间:2014-04-07 10:29:24

标签: c++ gcc bit-shift

我一直在看这段代码一小时......我拼命想找错误。

#include <iostream>

int main()
{
    for (int32_t n = 1; n>= 0; n--)
    {
        std::cout << "n: " << n << std::endl;
        std::cout << std::dec << "  64 - n: " << (64 - n) << std::endl;
        std::cout << std::hex << "  0x1ULL << 64: " << (0x1ULL << 64) << std::endl;
        std::cout << std::hex << "  0x1ULL << (64 - n): " << (0x1ULL << (64 - n)) << std::endl;
    }
}

这就是输出:

n: 1
  64 - n: 63
  0x1ULL << 64: 0
  0x1ULL << (64 - n): 8000000000000000
n: 0
  64 - n: 64
  0x1ULL << 64: 0
  0x1ULL << (64 - n): 1

对于n = 0,为什么(0x1ULL&lt;&lt; 64)与(0x1ULL&lt;&lt;(64-n))不同? n的类型似乎并不重要。

每个版本的GCC都是一样的。随意在线试用: http://www.compileonline.com/compile_cpp11_online.php

2 个答案:

答案 0 :(得分:8)

您有未定义的行为:

  

C ++ 11 5.8 / 1如果右操作数,则行为未定义   是负数,或大于或等于提升左操作数的位数

因此,假设long long有64位,移位64位将产生未定义的行为。

答案 1 :(得分:0)

左移位数应该小于类型的宽度。在这种情况下,int32_t类型的宽度是32位,并且您的移位超过其容量。那是错的。