背景
本篇学习总结,我将为大家讲解什么是计算机中的原码,反码,补码;同时讲解了为什么要采用反码和补码的加法来计算原码的减法。
机器数和真值
在正式讲解编码的概念之前,先介绍两个术语:真值和机器数。
真值
现实生活中,人们使用的自然数,就代表真值。即真实世界的数值。
机器数
计算机用二进制来表示数据,而这个二进制数就叫做机器数。
为了让CPU数据的运算更加高效,真值需要编码后才能进行处理。机器数的表现形式如下所示:
例如真值: -1,
如用原码编码,机器数为: 1000 0001 (注意这里由于有符号位的原因,原码转换成十进制数是129,而真值是-1。)
反码编码: 1111 1110
补码编码: 1111 1111
原码、反码、补码的概念和运算
概念
对于真值-1,其
- 原码: 1000 0001。(原码由两部分构成:1位符号位+真值的二进制数值)
原码可表示数据的范围: -127 ~ 127,字长为8时。 - 反码 : 1111 1110 (求-1的反码是符合号位不变,其余位取反。)
- 补码:1111 1111 (求-1的补码是在其反码的基础上,最低位加1。)
减法运算
我们先了解原码、反码、补码的减法运算:
计算机为了简化电路设计,把减法运算转成加法运算, 例如 1 - 1 , 转成加法运算: 1 + (-1) = 0; 用具体编码方式的形式来看,如下所示:
-
原码做减法: 0000 0001 + 1000 0001 = 1000 0010 = -2,-2不是我们要的真值0,所以原码不能进行减法运算。
-
我们再看看反码的减法运算:
反码做减法:0111 1110 + 1111 1110 = 1000 0000 => -0
-0 != +0
-0 =1000 0000
+0= 0000 0000
我们可以发现 0000 0000 , 1000 0000都能表示0.所以反码不能唯一表示一个整数。
- 我们继续看看补码的减法运算:
补码做减法:0111 1111+ 1111 1111 = 1000 0000 => -128 (约定1000 0000 等于-128)
为什么要用补码
从上面可知,有两个原因导致计算机采用补码来编码。
- 用原码做减法运算得到的结果不对。
- 而用反码做减法运算,当结果为0时,可能代表两个不多同的机器数。所以我们要用补码。
用补码,即能让符号位参与运算,又能做减法运算。同时最小值范围相对于原码和补码要多一位,即 -2^ (n-1) ~ 2^(n-1). 如果是有符号位int32,则取值范围是[-2^31 ~ 2^ 31-1]
总结
本文介绍了什么是原码,反码,补码,以及如何把原码转化成补码和解释了为什么计算机选择补码作为编码方式。