c - unsigned long long 类型的位移位

标签 c bitwise-operators

在一个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 位移位吗?

最佳答案

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

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

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

关于c - unsigned long long 类型的位移位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35634904/

相关文章:

C 编程 IEEE 754 十进制到二进制转换器

c - 有没有办法在没有模/除运算符的情况下写入 "mod 31"?

c++ - 按位操作函数

c - 是否有官方文档将读/写函数标记为线程安全函数?

c - 通过函数指针传递附加参数是否合法/在 C 中定义?

c - Keil Uvision 5 添加头文件和源文件?

c - 为什么我的函数会使程序崩溃?

Javascript 按位运算符混淆

javascript按位并产生奇怪的结果

bitwise-operators - 如何进行位掩码操作Pharo?