为什么〜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;
}
为什么〜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;
}
很多事情都错了。
您对 unsigned int 进行位否定,然后将其打印为有符号 int (%d
用于有符号整数)。将结果打印为无符号整数,您将意识到......
在 32位int
机器上,10
(十进制)不是1010
(二进制)而是000000000000000000000000000001010
.
最后,将所有内容转换回有符号整数并了解二进制补码表示法,以了解负数如何存储在您的计算机中。
不要忘记您正在翻转每一位,包括最高有效位(有符号变量的符号位)。将变量定义为无符号不会改变二进制表示,只会改变程序使用它的方式。
因此,当您将数字打印为带符号 ( %d
) 时,您将得到 -11。
10 = 0x0000000A (10)
~10 = 0xFFFFFFF5 (-11 signed / 4294967285 unsigned)
要打印为未签名使用:
printf("bitwise %u\n ",b);