c - C 位运算的行为

标签 c bit-manipulation

我目前正在试验 C 中的按位运算,我试图理解为什么此代码为变量 a 和变量 b 打印不同的值。 我知道 32 位移位会溢出 1 变量(即普通 int),但我的理解是在这两种情况下它都应该打印 0。

相反,它使用 unsigned int a 打印看似随机数的内容,并使用 unsigned long int b 打印 0 值。

#include <stdio.h>

int main(){
  printf("%lu %lu\n",sizeof(int), sizeof(long int));
  unsigned int a = 1 << 32;
  unsigned long int b = 1 << 32;
  printf("%u %lu\n", a, b);
  return 0;
}

示例输出:

4 8
374588997 0

我错过了什么?

编辑

现在我只尝试使用 31 位移位,编译器不会给我任何警告。 来源:

#include <stdio.h>

int main(){
  int shift = 31;
  unsigned long int b = 1 << shift;
  printf("%lu\n", b);
  return 0;
}

它输出 18446744071562067968 ,这实际上不是 2^31 。有什么线索吗?

最佳答案

更改您的代码如下

#include <stdio.h>

int main(){
  int shift = 31;
  unsigned long int b = 1LU << shift; /* or 1U << shift */
  printf("%lu\n", b);
  return 0;
}

您的系统上似乎 long int 是 64 位。

您得到的 int 结果为负,并尝试将其存储为 64 位无符号,导致出现奇怪的数字。

附: 18446744071562067968 = FFFFFFFF80000000

关于c - C 位运算的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23424985/

相关文章:

c - 在其他协议(protocol)似乎已关闭的情况下,如何运行DNS名称解析?

.net - 从托管应用程序调用的 native DLL 的堆栈溢出

c# - 标记枚举和按位运算与 “string of bits”

c# - 按位与如何与 bool 值交互?

c - PortAudio 回调,并在别处更改变量

c - 指针递增到 NULL 直到字符串结尾如下代码但是如果检查它证明是错误的为什么?

c - 无递归的后订单打印

c++ - 如何从文件中连续读取 N 个字节直到 EOF

将两个无符号字符连接为一个 uint16_t

c# - 替换 int 中的字节