文章里的代码均再vs2022中执行
整数二进制的三种表示方法:源码、反码、补码
三种表示方法的规则
有符号整数的三种表示方法中分为符号位和数值位,最高位的1(表示为负)或0(表示为正)
正整数和0和源码、反码和补码都相同。
负整数的源码:将整数写成二进制的形式
负整数的反码:符号位不变,其余为取反(即1换位0,0换位1)
负整数的补码:反码+1
补码+1可得到源码
补码先-1再取反可达到源码
注意:进行取反操作时,最高位的数字不变,即表示符号位的数字不变
例如:
int a = 1;
补码为:00000000000000000000000000000001
a的整形的大小为4个字节,即32个比特位。 一个字节是8个比特位。
int b = -1;
b的源码为:10000000000000000000000000000001
b的反码为:11111111111111111111111111111110
b的补码为:11111111111111111111111111111111
位操作符(& | ^ ~)的运用
在补码上进行相应操作的规则:
按位与& : 只要有0就是0,两个都为1才是1
按位或 | : 只要有1就是1,两个都为0才是0
按位异或^ : 相同为0,相异为1
按位取反 ~ :进行取反操作(0换为1,1换为0)
如:
#include <stdio.h>
int main()
{
int a = 1;
int b = -1;
printf("%d\n", a & b); //a的补码:00000000000000000000000000000001
//b的补码:11111111111111111111111111111111
//进行按位与操作后的补码:
// 00000000000000000000000000000001 (为正整数)
//故源码为 00000000000000000000000000000001 (即为1)
printf("%d\n", a | b); //a的补码:00000000000000000000000000000001
//b的补码:11111111111111111111111111111111
//进行按位或操作后的补码:
// 11111111111111111111111111111111 (为负整数)
//取反: 10000000000000000000000000000000
//加1: 10000000000000000000000000000001 (此为源码,即为-1)
printf("%d\n", a ^ b); //a的补码:00000000000000000000000000000001
//b的补码:11111111111111111111111111111111
//进行按位异或操作后的补码:
// 11111111111111111111111111111110 (为负整数)
//取反: 10000000000000000000000000000001
//加1: 10000000000000000000000000000010 (此为源码,即为-2)
printf("%d\n", ~a); //a的补码:00000000000000000000000000000001
//进行按位取反操作后的补码:(进行按位取反的操作时,符号位也需要取反)
// 11111111111111111111111111111110
//取反: 10000000000000000000000000000001
//加1: 10000000000000000000000000000010 (此为源码,即为-2)
return 0;
}
运行结果:
1
-1
-2
-2