【问题标题】:Bit shift for 32 and 64 unsigned integers32 位和 64 位无符号整数的位移
【发布时间】:2016-11-17 19:22:12
【问题描述】:

我对这段代码的 sn-p 有疑问:

uint32_t c = 1 << 31;
uint64_t d = 1 << 31;
cout << "c: " << std::bitset<64>(c) << endl;
cout << "d: " << std::bitset<64>(d) << endl;
cout << (c == d ? "equal" : "not equal") << endl;

结果是:

c: 0000000000000000000000000000000010000000000000000000000000000000
d: 1111111111111111111111111111111110000000000000000000000000000000
not equal

是的,我知道“d”的解决方案是使用“1ULL”。但我不明白为什么当移位为 31 位时会发生这种情况。我在某处读到移动 size-1 位是安全的,所以如果我编写没有“UUL”的指令并且文字“1”的长度为 32 位,那么将其移动 31 位应该是安全的,对吧? 我在这里错过了什么?

问候

YotKay

【问题讨论】:

  • 对。谢谢!
  • "是的,我知道 'd' 的解决方案是使用 '1ULL'。"你知道错了,这种情况下1U就够了。

标签: c++


【解决方案1】:

问题是你左移的表达式,即常量1,被视为一个有符号整数。这就是为什么编译器在将结果分配给d之前对其执行符号扩展,从而导致您看到的结果。

将后缀U 添加到1 将解决问题(demo)。

uint64_t d = 1U << 31;

【讨论】:

  • 对。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-10
  • 1970-01-01
  • 2011-01-17
  • 2013-06-21
  • 2014-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多