JVM1:计算机中整形和浮点型二进制保存的具体形式

整数的表示:

原码:

一个数在计算机中的二进制表示形式

第一位是符号位(0为正数,1为负数)

反码:

负数反码:符号位不动,按位取反

正数补码:和原码相同

补码

负数补码:符号位不动,反码加1

正数补码:和原码相同

 

为什么要用补码 , 我们以8位的数字1为例来说明:

首先计算机的设计只有加法运算 ,不区分符号位  ,如果最高位(符号位)有进位,则进位就舍弃 , 而且所有的位数都要参与加法运算。

+1 : 原码 = 反码 = 补码  = 0000 0001

-1: 原码  = 1000 0001;反码 =1111 1110;补码=11111111;

原码计算: +1- 1 = (+1) + (-1)= (0000 0001)+(1000 0001)=(1000 0010) =-2可以看到如果是原码计算减法,符号位也参与计算的话,结果明显不正确

反码计算: +1- 1 = (+1) + (-1)= (0000 0001)+(1111 1110)=(1111 1111)=(1000 0000)=0以看到反码计算减法,真值部分是正确的,但是得出的结果是 -0:[0000 0000]和[1000 0000]都表示0

补码计算 : +1 - 1 = (+1) + (-1)= (0000 0001)+ (1111 1111)= (0000 0000)= (0000 0000)= 0可以看到补码计算减法 ,就避免了-0的问题因为(1000 0000) + (0000 0001) = (1000 0001)= (1111 1111))= -127所以(1000 0000)用来表示 -128 , (1000 0000)没有相应的原码和反码。

补码原理 :因为-n = 0 - n ,而且相加时候 ,如果高位溢出就直接舍弃 ,所以我们计算0 - n的时候把高位还原回来。-1为例 ,-1 = 0 - 1 = (0000 0000) - (0000 0001) = (1 0000 0000) - (0000 0001) = (11111111)

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

 

浮点数的定义与表示 , IEEE规定的单精度浮点数内部构造如下:




1. 第一段s 是符号位(0为正数,1为负数)

2. 第二段e 是指数域  , 采用移位存储 , 共计8bit

3. 第三段m 是尾数 , 共计23bit

4. 在计算机中, 任何一个浮点数都可以用二进制的科学计数法表示都为1.xxx*2n  , 尾数部分就是xxx , 因为第一位固定位1 , 所以23bit的尾数部分其实表示的是24bit的数据  ;  例如 8.25用二进制表示可表示为1000.01 , 用二进制的科学计数法表示1000.01可以表示为1.0001*23  ; 例如 0.125用二进制表示可表示为0.001 , 用二进制的科学计数法表示0.001可以表示为1.0*2-3

5. 指数部分是8位的浮点数时,基数就定为 0111 111 及 127,比127小的数表示负数,比127大的表示正数 , 所以1.0001*23的指数部分就为(127+3) , 1.0*2-3指数部分就为(127-3)

6. 所以8.25在计算机内存中保存的二进制数据为 : 0-130-00001 , 0.125在内存中的表示为 0-124-0

猜你喜欢

转载自blog.csdn.net/gethinyang/article/details/79195722