我目前正在试验 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/