一、前言
1.计算机只能定向识别二进制语言。
2.计算机底层存储数据,存储的是二进制补码。
原因:存储补码的效率最高。
3.计算机本身只能计算加法程序,正数与负数相加,如果采用原码相加,如下:
int main()
{
int i = 1;
int j = -1;
i + j;
//00000000000000000000000000000001 - 1的原码
//10000000000000000000000000000001 - -1的原码
//10000000000000000000000000000010 - -2
return 0;
}
如图所示我们将会得到一个-2,而不是得到我们想要的零。
注:
对于有符号的数,其二进制的首位是符号位,1 表示为负数,0 表示为正数。
二、正文
1.什么是补码
要搞清楚什么是补码,我们需要先了解原码和反码。
原码是相应的数转化成二进制数,
反码是对原码的每个二进制位(除符号位)进行按位取反。
补码是对反码进行+1得到的。
(1)正数
int i = 1;
正数的原码、反码和补码是相同的,这里将i的值赋值为1。
其原码:00000000000000000000000000000001
反码:00000000000000000000000000000001
补码:00000000000000000000000000000001
(2)负数
int j = -1;
负数的原码、反码各不相同,这里将j的值赋值为-1.
其原码:10000000000000000000000000000001
反码:11111111111111111111111111111110
补码:11111111111111111111111111111111
2.计算
计算机对两个数进行计算是采用两个数的补码进行计算。
3.转换
对于原码转换为补码只有一种转换,而补码转换为原码有两种。
(1)先减一,然后进行除符号位的按位取反。
(2)先进行按位取反,然后再进行加一。