原码反码补码与byte的取值范围

1.三种存储形式

计算机中对数据的二进制存储形式-------补码(下面讨讨论的皆为byte类型)

原码:45:00101101 -45:10101101

在最高位代表符号位区分正数还是负数,0代表正数,1代表负数

反码:45:00101101 -45:11010010

正数的原码和反码相同,负数的反码等于原码的符号位不变,其余各位按位取反

补码:45:00101101 -45:11010011

正数的原码反码和补码都形同,负数的补码等于在其反码基础上末尾+1

2.为什么计算机设计反码?

因为计算机只有加法没有减法,在做减法运算的时候,可以认为是加上一个负数,这样可以减少计算机电路的复杂度。使用原码进行减法运算会出现问题,例如计算1-1,因为计算机有加法没有减法,所以计算机自动换算成1+(-1)

原码减法

1-1=1+(-1)=[00000001]原+[10000001]原=[10000010]原=-2 (符号位也参与运算)

与实际结果不符。

反码减法

1-1=1+(-1)=[00000001]原+[10000001]原=[00000001]反+[11111110]反=[11111111]反=[10000000]原=-0

通过反码计算的结果是11111111在计算一次反就成原码了,得出的结果是正确的,但是有一个问题是 00000000可以代表+0 10000000可以代表-0,其实是一样的,用2个编码实在是浪费。于是出现了补码解决0的符号以及两个编码的问题。

补码减法

1-1=1+(-1)=[00000001]原+[10000001]原=[00000001]补+[11111111]补=[00000000]补=[00000000]原

这样0用[0000 0000]表示, 而以前出现问题的-0则不存在了。

简单来说,反码是为解决减法了运算,补码解决了反码产生的+-0的问题。

3.为什么byte类型127 +1 是(-128)

使用补码, 不仅仅修复了0的符号以及存在两个编码的问题, 而且还能够多表示一个最低数. 这就是为什么8位二进制, 使用原码或反码表示的范围为[-127, +127], 而使用补码表示的范围为[-128, 127]。

因为机器使用补码, 所以对于编程中常用到的32位int类型, 可以表示范围是: [-2^31, 2^31-1] 因为第一位表示的是符号位.而使用补码表示时又可以多保存一个最小值。

计算来看:+127的补码为0111 1111 +1的补码(0000 0001)=1000 0000,过程中进位改变了符号位,而1000 0000不再表示0而是-128的补码。

上一篇:MyDAL - .UpdateAsync() 之 .Set() 使用


下一篇:JAVA数组排序