原码反码补码、浮点数
原码
数值具有正负两种符号,但是计算机仅由0和1两种状态构建而成,因此并没有专门用来表示正负号的原生方式,我们凭直觉设计就是挪用其中的一位来表示正负号,简单起见,如果我们用3位表达一个数值,这样的编码系统实际上能够表达的范围将会是:
-(2^2 - 1) = -3, -2, -1, -0, +0, +1, +2, +(2^2 - 1) = +3
缺点:
首先,0的表示不唯一,出现了-0和+0
其次(也是更重要的原因)它需要单独的硬件电路来确定正负号。
反码
即一个负数的二进制形式改为其绝对值部分按位逐位反转,称为 [ 一补码 ] (ones’ complement),举例来说,如果我们用3位表达一个数值, 十进制数值 -2 用反码表示是 101 (就是 +2 的逐位反转),对应到数字逻辑电路就是按位反转,说白了就是一个反相器,因此,一补码也被称为 [ 反码 ]。
优点
不用一个单独的硬件电路确定正负号
缺点
仍存在+-0
补码
无论是 [ 原码 ] 还是 [ 反码 ] 都有各自的缺点,于是补码闪耀登场,现代硬件广泛使用补码。
代码测试
测试结果:
个人随笔
在4位的设定下:
int x=-1;//-1的二进制原码表示1001,补码表示1111
x=-1;//x二进制原码表示0001,补码表示为0111