计算机在整数编码上采用 补码 的方式
基于 8 位系统分析,以 正数1 和 负数 -1 为例
示例 | 原码 | 反码 | 补码 |
---|---|---|---|
正数 1 | 0000 0001 | 0000 0001 | 0000 0001 |
负数 -1 | 1000 0001 | 1111 1110 | 1111 1111 |
最高位表示符号位:0 正数 / 1 负数
正数:原码、反码、补码相同
负数:原码最高位符号位,反码 在原码基础上除符号位外取反,补码 在反码的基础上+1
求负数的补码
十进制推二进制:该负数的绝对值,取反再+1
以 -1 为例
- -1 的绝对值 1 -> 0000 0001
- 取反 +1 -> 1111 1110 + 1 = 1111 1111
二进制推十进制:正数原码补码一样,负数取反+1,再添加正负。
以 1111 1111 为例
- 高位是1 明确是负数
- 取反 + 1 -> 0000 0000 + 1 = 0000 0001
- 添加符号 1000 0001 = -1
为什么计算机采用补码?而不采用有逻辑的原码?
以计算 1+ (-1) 为例:
原码计算: 0000 0001 + 1000 0001 = 1000 0010 = -2
补码计算: 0000 0001 + 1111 1111 = 0000 0000 = 0 (最高位溢出,相当于丢弃),完美解决为题,故为了运算方便,舍弃了逻辑性。
-
以 -128 为例
最高位符号位
127 原码 0111 1111
-128 原码 无
-128 反码 无
-128 反码 1111 1111 (1111 1111(反码) + 1 = 1000 0000,这里实际上真正相加的是1111 1111后面的7位,第1位是符号位始终不会变,所以,当进到第8位的时候,溢出舍弃)
扩展资料:
byte类型的取值范围:有符号的[-128,127] 无符号的[0,255]
对于有符号的数据类型来说:最高位为符号位 0 为正数,1为负数
二进制数的补码
-
求二进制数的补数,目的是往计算机里面存放。
-
在计算机里面,存放的数字什么的,都称为机器码;那么二进制形式的补数,也就改称为补码了。
-
一般情况下,都是以 8 位二进制数来讨论补码,少数也有用 16 位数的。
-
计算时加上正数,是不需要进行求7a686964616fe78988e69d8331333366303830取补数的;只有进行减法(或者加上负数),才需要对减数求补数。
-
计算结果如果超出了-128~+127的范围,结果将是错误的,这是没有办法纠正的。
-
应用补码进行计算,完全符合前面介绍的“用补数可把减法转换成加法”的做法,只要忽略进位(这个进位1,就是求补的时候,加进去的1 0000 0000中的1),结果就是正确的。
-
求取补码,就按照定义的规定,负数采用“模减去绝对值”的方法来求,这是求补数的通用方法,适合于各种进制、各种大小的数字。
-
不要用求反加一的方法,也就不用理会原码和反码了,也不牵涉符号位的问题。
网友评论