原码,反码,补码详解及原理
原码
(1) 原码:在数值前直接加一符号位的表示法。
例如: 符号位 数值位
byte 的取值范围
[+7]原= 0 0000111 B [-7]原= 1 0000111 B
注意:
byte 的取值范围是-2^7~ 2^7-1 总计 256 个数
即:
无符号位 0~255 (因为计算机是从 0 开始计算的而不是 1)
有符号位 -128 ~ +127
反码
浮点表示方法(2)反码:正数:正数的反码与原码相同。负数:负数的反码,符号位为
“1”,数值部分按位取反。例如: 符号位 数值位
[+7]反= 0 0000111 B
[-7]反= 1 1111000 B
注意:1000 0000 B 不等于 0 而是 -128
+127 +1 = -128
即 0111 1111 B+1 = 1000 0000 B
也就是发生了 byte 值溢出
8 位二进制反码的表示范围:-127~+127
为什么 -128 的二进制会是 1000 0000;
1000 0000 (原) = 1111 1111(反)
那么问题来了: 64+32+16+8+4+2+1 = 127 为什么会有 128 呢?
原来 负数的反码是需要补码来计算的,也就是在最后得出的结果上 +1
注意:计算机中只有 +0 而不存在 -0 的说法,因为-0 是完全没有意义的存在,
即:只有 0000 0000 = +0
而没有 1000 0000 = -0
1000 0000 的真实身份是 -128
补码
(3)补码的表示方法
1)模的概念:把一个计量单位称之为模或模数。例如,时钟是以 12 进制进行计数循环的,
即以 12 为模。在时钟上,时针加上(正拨)12 的整数位或减去(反拨)12 的整数位,时
针的位置不变。14 点钟在舍去模 12 后,成为(下午)2 点钟(14=14-12=2)。从 0 点出发
逆时针拨 10 格即减去 10 小时,也可看成从 0 点出发顺时针拨 2 格(加上 2 小时),即 2 点
(0-10=-10=-10+12=2)。因此,在模 12 的前提下,-10 可映射为+2。由此可见,对于一个
模数为 12 的循环系统来说,加 2 和减 10 的效果是一样的;因此,在以 12 为模的系统中,
凡是减 10 的运算都可以用加 2 来代替,这就把减法问题转化成加法问题了(注:计算机的
硬件结构中只有加法器,所以大部分的运算都必须最终转换为加法)。10 和 2 对模 12 而言
互为补数。
同理,计算机的运算部件与寄存器都有一定字长的限制(假设字长为 8),因此它的运算
也是一种模运算。当计数器计满 8 位也就是 256 个数后会产生溢出,又从头开始计数。产
生溢出的量就是计数器的模,显然,8 位二进制数,它的模数为 2^8=256。在计算中,两个