无符号长long类型的按位移位

时间:2016-02-25 18:04:38

标签: c bitwise-operators

在c程序中。我试图在uint64_t变量上使用左移运算符。

E.g。

  // 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的大小,即无符号长long是64位。那么在64位移位之前它不应该工作吗?

1 个答案:

答案 0 :(得分:2)

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

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

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