【问题标题】:Setting all bits in int64_t设置 int64_t 中的所有位
【发布时间】:2013-05-02 23:13:31
【问题描述】:

根据以下代码,我希望将 x 中的所有位设置为 1,但不知何故只设置了前 32 位:

int64_t x = 0xFFFFFFFF;
x<<32;
x|=0xFFFFFFFF;

注意:在每行之后打印 x 会导致 4294967295(低 32 位设置为 1)。 另外,尝试使用numeric_limits&lt;int64_t&gt;::min() 没有成功。 我的问题是如何设置 x 中的所有位? 使用 RHEL5.5。

谢谢

【问题讨论】:

  • 你是如何打印的?
  • 如果一切都失败了,我的意思是因为它不漂亮,memset(&amp;x, 0xFF, 8)
  • 构建一个流串并打印它,没有精度。假设打印没问题,我在后面的代码中“看到”它是错误的
  • @peachykeen : 尽量避免 memset,但我还是会尝试,谢谢
  • 如果你关心比特,你为什么使用int64_t而不是uint64_t? (并且x&lt;&lt;32 不起作用,因为您要丢弃结果;您想要x &lt;&lt;= 32。)但是将1 移动到符号位位置具有未定义的行为——因此我对uint64_t 的问题。跨度>

标签: c++ int64


【解决方案1】:

x&lt;&lt;32 计算将x 左移 32 位的结果并且对该值不做任何事情。你想改用x &lt;&lt;= 32

【讨论】:

  • jwodder 有你想要的 OP。您忘记分配结果:x = x
  • 顺便说一句,由于溢出,这在技术上是未定义的行为
【解决方案2】:

为什么不int64_t x = -1?或uint64_t x = ~0

【讨论】:

  • 发帖后居然做到了,你完全正确。谢谢
【解决方案3】:

这将起作用:

int64_t x = ~0LL;   (iner

int64_t x = -1LL;

您可能会因为没有LL 而侥幸,但不能保证 - 取决于编译器。

【讨论】:

  • 而且,你可能会得到 LL :) (“取决于编译器”,虽然 128 位 long long 暂时不会出现)
猜你喜欢
  • 2022-07-21
  • 2013-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-28
  • 2021-06-05
相关资源
最近更新 更多