为什么要用补码表示
补码系统的最大优点是可以在加法或减法处理中,
不需因为数字的正负而使用不同的计算方式
。只要一种加法电路就可以处理各种有号数加法,而且减法可以用一个数加上另一个数的补码来表示,因此只要有加法电路及补码电路即可完成各种有号数加法及减法,在电路设计上相当方便
比如对于
3-2
,
3 = 0011
,
-1 = 1111
,二进制表示就是
0011 + 1111 = 10010
,
10010
显然是个负数,这里并不是算的不对,而是结果产生了溢出,本来只有4位,相加的结果是5位,这样的话就是直接
去掉最高位
,结果是
0010 = 1
另外,
补码系统的0就只有一个表示方式
,如果只是简单的最高位是
1
或
0
来表示正负,那么
0
就有两种表示方式
00....00
或者
10....00
,这样不仅仅是一种浪费,并且要判断一个数是否等于
0
,就要比较两次了,要分别看它是不是
00....00
或者
10....00
上图是8位系统中整数的表示方式
补码到底是什么,为什么-128的补码是10000000
-128=10000000
,是怎么得来的呢,如果按照我们教科书上的说法,负数的补码等于正数的反码加1(也又说符号位为1不变,剩下的反码加1),不管怎么说在8位系统下表示不了128,128应该等于
010000000
,这就是9位了
计算机是怎么区分无符号有符号的
对二进制
00000001
,无符号数表示
1
,有符号
+1
对二进制
10000001
,无符号数表示
129
,有符号数表示
-127
如果把他们相加得到
1000010
可以表示
130
,也可以表示
-126
那么计算机是怎么区分这个数到底是有符号数还是无符号数呢,其实
计算机并不区分有无符号
。计算机只存储了这三个二进制数,是我们的编译器来区分数字的类型的,定义的是有符号的,print()的就是
-126
,定义的是无符号的,输出的就是
130
zh.wikipedia.org/zh-cn/%E4%B…