计算机内部的数值存储

计算机中的数值存储

机器数和真值

一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1.

比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。那么,这里的 00000011 和 10000011 就是机器数。

原码、反码、补码

原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。

反码的表示方法是:正数的反码是其本身;的反码是在其原码的基础上, 符号位不变,其余各个位取反。

补码的表示方法是:正数的补码就是其本身;的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)。

原码有什么问题(1+(-1)=-2)

如果使用原码进行计算: 1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2

问题:计算错误

反码有什么问题(1+(-1)=-0)

如果使用反码进行计算: 1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0 问题:0带符号是没有任何意义的,而且会有[0000 0000]原和[1000 0000]原两个编码表示0。

补码运算

1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]补 + [1111 1111]补 = [0000 0000]补=[0000 0000]原

补码表示的溢出

由于计算机中的数字用补码表示,例如8bit的byte类型的表示范围为:

[-128, 127]

0 = [0000 0000](补)

-128 = [1000 0000](补)

127 = [0111 1111](补)

当byte类型的变量超上限127时,如:

+128 = -(-128)= 127 + 1 = [1111 1111](补)+ [0000 0001](补) = [1000 0000](补) = -128

+129 = 127 + 2 = [1111 1111](补)+ [0000 0001](补) = [1000 0001](补) = [1111 1111](原) = -127

当byte类型的变量超过下限-128时:

-129 = -128 - 1 = [1000 0000](补) - [0000 0001](补) = [0111 1111](补) = 127

-130 = -128 - 2 = [1000 0000](补) - [0000 0010](补) = [0111 1110](补) = 126