为什么~10的结果是-11?不应该是5,因为〜操作翻转每一点。
10 = 1010
~10 = 0101 // 5十进制
#include<stdio.h>
int main()
{
unsigned int b =10;
b= ~b;
printf("bitwise %d\n ",b);
return 0;
}
答案 0 :(得分:14)
这有很多不妥之处。
您正在对无符号整数进行位取消,然后将其打印为带符号的整数(%d
用于有符号整数)。将结果打印为unsigned int,您将意识到......
在32位 - int
计算机上,10
(十进制)不是1010
(二进制),而是000000000000000000000000000001010
。
最后,将所有内容转换回有符号整数,并了解两个补码表示法,了解负数如何存储在您的计算机中。
答案 1 :(得分:7)
不要忘记您正在翻转每个位,包括最高位(签名变量的符号位)。将变量定义为无符号不会更改二进制表示,只会更改程序使用它的方式。
因此,当您将该号码打印为已签名(%d
)时,您将获得-11。
10 = 0x0000000A (10)
~10 = 0xFFFFFFF5 (-11 signed / 4294967285 unsigned)
打印为无符号用途:
printf("bitwise %u\n ",b);