【问题标题】:Bitwise shift for unsigned long long typeunsigned long long 类型的按位移位
【发布时间】:2016-02-25 18:04:38
【问题描述】:

在一个 c 程序中。我正在尝试对 uint64_t 变量使用左移运算符。

例如

  // with shift of 24 bits
  uint64_t x = 0;
  x = (((uint64_t)76) << (24));
  Output is: x = 1275068416
  ---------------------------------------------
  // with shift of 32 bits
  uint64_t x = 0;
  x = (((uint64_t)76) << (32));
  Output is: x = 0

如果我执行左移直到 24 位,那么它工作正常,但在 32 位时它输出 0。而我认为是 uint64_t 的大小,即 unsigned long long 是 64 位。那么它不应该在 64 位移位之前工作吗?

【问题讨论】:

  • 你用什么结构来检查x的值?
  • 我只是使用 printf as printf("....%d\n", x); 打印出 x 的值;
  • QED,然后.. %d 正在为 ints 工作。使用“%llu
  • 啊,就是这样。要打印uint64_t 类型的值,您需要printf("%"PRIu64"\n", x);
  • @EugeneSh。和 Andrey Chernyakhovskiy ...谢谢它按照你们俩的建议工作:-)

标签: c bitwise-operators


【解决方案1】:

您在打印输出时使用了错误的格式说明符。 %d 格式说明符需要 int,这在您的系统上显然是 32 位的。因此,传递一个 64 位值(以及一个无符号值)会导致未定义的行为。

您应该使用 PRIu64 宏来为无符号 64 位值获取正确的格式说明符。

printf("%"PRIu64"\n", x);

【讨论】:

  • %lu 仅供unsigned long 使用。在通常为 32 位的 Windows 机器上。
  • @AndreyChernyakhovskiy 谢谢。已应用编辑。
猜你喜欢
  • 2013-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-24
  • 2016-07-29
  • 2013-09-22
相关资源
最近更新 更多