本文主要介绍计算机中正负数的原码,反码,补码。
目录
一,什么是原码,反码,补码。
1,原码
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。
2,反码
正数的反码是其本身。负数的反码是在其原码的基础上, 符号位不变,其余各个位取反。
3,补码
正数的补码就是其本身。负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1。
二,为什么要使用原码,反码,补码?
首先在思考这个问题前我们要知道什么是机器码,什么是真值。
1,机器码
一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1.比如,十进制中的数 +2,计算机字长为8位,转换成二进制就是00000010。如果是 -2 ,就是 10000010 。那么,这里的 00000010 和 10000010 就是机器数。
2,真值
因为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数 10000010,其最高位1代表负,其真正数值是 -2 而不是形式值121(10000010转换成十进制等于101)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。
例如:0000 0010的真值 = +000 0010 = +2,1000 0010的真值 = –000 0010 = –2
3,使用原码,反码,补码的真正原因。
其根本原因是为了简化计算机集成电路的设计,因为计算机只擅长做加法运算。
原因:首先,我们的人类的大脑知道第一位是符号位,在进行运算时,我们理所应当的会根据第一位,也就是符号位,选择对真值区域的加减。但是对于计算机而言,加减乘除以及取余等都是最基础的运算,但是对于辨别符号位显然对于计算机而言就是一个浩大的工程,对于我们而言对电路的设计也变得格外的复杂,所以就有了先辈想出了将符号位也参与运算的办法。
我们都知道1-1=0这很简单,变换一下根据运算法则一个正数加上一个相同的负数他的结果也为零,即 1-1 = 1 + (-1) = 0。这也一点也不复杂,将这个算法用于计算机,由于没有了减法运算,只有加法运算计算机处理起来就不会变的那么复杂,对于电路的设计也就没有那么复杂了。
三,计算机使用的是什么?
在计算机中所有数据都是已补码形式存储。
表⽰数据类型是有符号(可能是正数也可能是负数)的数据类型,需要在数 据类型前加上 关键字 signed:
有符号的整型数据: signed int
有符号的浮点型数据: signed float
通常不写signed时,编译器也会认为是有符号的数据类型 ⽆符号数据类型(没有符号,数据类型都是正数),没有符号位,类型⼤⼩ 为多少,表⽰数据位数有多少。
表⽰⽆符号的数据类型前加上 关键字unsigned:
⽆符号的整型数据: unsigned int
四,举例说明
正数7和负数7的原码,反码,补码。