一,机器数
在计算机中用二进制表示的数称之为机器数。
机器数是有正负之分的,计算机用一个是二进制的最高位存放符号,这个bit位我们就称之为符号位,正数的符号位为0,负数的符号位为1,比如,十进制中的+10通过计算机转化为八位的二进制为00001010(一个byte有8个bit),如果是-10就是10001010,二进制储存方法有原码,反码,补码三种,
二,原码
以二进制的形式表示的数就称为原码,最左边的一个就是符号位,0表示为正数,1表示为负数,其他位表示数据位,有效的取值范围是1111111(-128)----01111111(+128),
正数间的计算
例如 :5 (00000101)+2(00000010)=7(00000111)
0 0 0 0 0 1 0 1
+ 0 0 1 0
------------------
0 0 0 0 0 1 1 1
负数的计算
负数的计算是否和正数一样呢,不妨我们试试看-56(10111000)-1(00000001)
1 0 1 1 1 0 0 0
- 1
-----------------
1 0 1 1 0 1 1 1
10110111转换为十进制时是-55,这明显与预期不符,为了解决这个问题,人们又发明了反码,
三,反码
正数的反码和原码保持一致,负数的反码是原码的符号位不变,其余位取反,
现在我们用反码来计算一下负数的加减运算,
1 1 0 0 0 1 1 1
- 1
-----------------
1 1 0 0 0 1 1 0
-56(11000111)-1(00000001)=-57(11000110),和预期符合,所以就解决了负数的运算,但是在负数与正数进行加减运算时计算结果又出现了问题,例:-3+5
1 1 1 1 1 1 0 0
+ 0 1 0 1
-----------------
0 0 0 0 0 0 0 1
计算结果本应该是2(00000010),但是显示结果却是1(00000001)结果显然不对,这时又发现了补码,
补码
正数的补码是其本身,负数的补码等于其反码加一,补码的出现主要是为了解决跨零的计算的问题
我们再用补码计算一下-5+3
1 1 1 1 1 1 0 1
+ 0 1 0 1
-----------------
0 0 0 0 0 0 1 0
结果00000010转换为十进制等于2,结果正确
总结
在计算机中无论是正数还是负数都是用补码来进行储存和计算的,补码弥补了原码和反码不能解决的计算问题,