关于原码,反码,补码的一些问题
原码,反码,补码
原码
二进制
十进制转换为二进制:
-
整数部分转换。
- 除2取余法:将十进制整数反复除以2,记录每次的余数(0或1),直到商为0。最后将余数逆序排列即为二进制结果。例如,十进制数10转换过程如下:
10 ÷ 2 = 5 余 0
5 ÷ 2 = 2 余 1
2 ÷ 2 = 1 余 0
1 ÷ 2 = 0 余 1
逆序排列余数得1010 - 幂次拆分法:通过分解为2的幂次方之和快速转换。例如,19 = 16 + 2 + 1 = 2⁴ + 2¹ + 2⁰,对应二进制
10011
- 除2取余法:将十进制整数反复除以2,记录每次的余数(0或1),直到商为0。最后将余数逆序排列即为二进制结果。例如,十进制数10转换过程如下:
-
小数部分转换。
-
乘2取整法
:将小数部分不断乘以2,取整数部分(0或1),直到小数部分为0或达到精度。例如,0.625转换过程:
-
625 × 2 = 1.25 → 取1。
-
25 × 2 = 0.5 → 取0。
-
5 × 2 = 1 → 取1。
-
顺序排列得
0.101
-
-
周期数
- 周期一般理解是:对于函数y=f(x),如果存在一个不为零的常数T,使得当x取定义域内的每一个值时,f(x+T)=f(x)都成立,那么就把函数y=f(x)叫做周期函数,不为零的常数T叫做这个函数的周期
- 那么假设一个数据类型的长度 T 是固定的,在不看符号的情况下,如果赋值s大于长度,则会取消进位,得到f(s)= f(s-T),这个长度T就可看做周期数
原码
原码(true form)是一种计算机中对数字的二进制定点表示方法。原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1(0有两种表示:+0和-0),其余位表示数值的大小。
-
以byte为例:一个byte类型的数据,它的长度是8位,则它的周期数就是2^8个数,即256个数
byte i1 = 30; byte i2 = -30;30的原码是00011110
-30的原码是10011110
byte的取值范围是127 ~ -128,总共有256个整数
其中 -128的原码规定为10000000,因为算上符号位的话 -128的原码应为9位,即110000000
超过了byte的长度,则将 -0的原码定为 -128的原码
反码
-
正数的反码和原码相同
-
负数的反码是原码符号位不变,每一个位取反
例: -30的反码是11100001
补码
- 正数的原码,反码,补码都相同
- 负数的补码为反码+1,例:-30的原码是10011110,反码是11100001,补码是11100010
以上是补码的计算方法,那么补码的原理是什么呢?
计算机本身在计算数据时是不会将符号位独立出去的,也就是说在计算的时候是要把符号位算作数值来计算的,也就是说计算机不会做减法运算,所以就引入了补码这个设定。
那么计算机减法运算就是[a-b]补=a补+(-b)补
那么补码是怎么来的,为什么负数的补码为其反码+1?
前面提到了周期数这个概念,以byte为例,byte的周期数位28,也就是说超过了28就要重新计数,就会出现x-y=x+28-y的情况,这样就会出现-y=28-y
引入模运算的概念,即-y的补码就等于2^8-y的原码
例:-30的补码为11100010,2^8-30=226的原码为11100010(这里超过byte的取值范围,所以是从计算机运算的角度看,符号位算到数值里)
则可得到结论 50-30=50+226 即 50-30=50+(2^8-30)

浙公网安备 33010602011771号