目录
一:前提引入
在计算机中,一个字节8位,可以表示2^8=256没有符号数那就是-128~+128,但实际上范围却是-128到127,这是为什么?其实产生这个问题的根本原因就是我们习惯用人的思维来思考计算机做的事。在探究原因之前,我们先来看一下学过的几种编码方式。
二:编码方式介绍
(1)原码
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。比如如果是8位二进制。
[+1]原 = 0000 0001
[-1]原 = 1000 0001
第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是:
[1111 1111 , 0111 1111]
即
[-127 , 127]
原码是人脑最容易理解和计算的表示方式。
(2)反码
正数的反码是其本身
负数的反码是在其原码的基础上,符号位不变,其余各个位取反。
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反
可见如果一个反码表示的是负数, 人脑无法直观的看出来它的数值. 通常要将其转换成原码再计算.
(3)补码
正数的补码就是其本身
负数的补码是在其原码的基础上,,符号位不变, 其余各位取反, 最后+1。(即在反码的基础上+1)
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补
对于负数, 补码表示方式也是人脑无法直观看出其数值的. 通常也需要转换成原码在计算其数值。
三:使用源码、反码和补码的原因
现在我们知道了计算机可以有三种编码方式表示一个数。对于正数因为三种编码方式的结果都相同:
[+1] = [00000001]原 = [00000001]反 = [00000001]补
所以不需要过多解释。但是对于负数:
[-1] = [10000001]原 = [11111110]反 = [11111111]补
可