Android面试题(2):原码、反码、补码

有符号数处理
“补码”的数学原理

1. 从基本数据类型的取值范围引出的问题

长度 取值范围
byte 1字节 -128~127
short 2字节 -2^15 ~ 2^15 -1
int 4字节 -2^31 ~ 2 的 31 次方-1
char 2字节 \u0000~\uFFFF ( Unicode 0 ~ Unicode 2^16-1)
long 8字节 -2 的63 次方 +2 的 63 次方-1
float 4字节 IEEE754
double 8字节 IEEE754
boolean 1字节 true or false

1. 为什么byte是的取值是 -128 ~ 127呢?
2. float和double的IEEE754是什么东西,取值范围到底是多少?

先来说第一个问题,因为计算机中是采用补码的方式表示符号数的。将二进制的最高位作为符号位,0表示正数,1表示负数。byte的取值范围从 1000 0000 到 0111 1111, 正好是-128 到 127。 (注:1111 1111用来表示最接近0的负正数 -1,以此类推,1000 0001为-127,最小的1000 0000 则为-128,而不是你们想的“负零”)

2. 原码,反码,补码

计算机中的符号数有三种表示方式:原码,反码,补码。三种表示方法均有符号位和数值位两部分,最高为作为符号位,剩下的是数值位,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。

1. 原码(true form)

原码的数值位和普通的二进制表示一样,非常容易理解,我们用8位二进制来演示(之后都是使用8位演示,不再赘述):
1的原码为0000 0001, -1的原码 1000 0001。

优点:简单直观

缺点:原码不能直接参加运算,可能会出错。例如数学上,1+(-1)=0,而在二进制中
00000001+10000001=10000010,换算成十进制为-2, 显然出错了。
所以原码的符号位不能直接参与运算,必须和其他位分开,这就增加了硬件的开销和复杂性。

2. 反码(ones’ complement)

原码无法直接进行运算,于是出现了反码。

正数的反码与原码相同,负数的反码,数值位取反:
1的反码为 0000 0001, -1的反码为 1111 1110。

反码的出现主要是用来处理减法运算的(好像是因为cpu只能进行加法运算):
- 例1:
1减1,可以变换为 0000 0001 + 1111 1110 = 1111 1111, 也就是负0;

  • 例2:
    3减2,可以变换为 0000 0011 + 1111 1101 = 1 0000 0000, 这个例子中二进制加法仅仅得到了0000 0000,这是一个错误的答案,只有当加上进位时才能得到正确答案(0000 0001);

  • 例3:
    4减2,可以变换为 0000 0100 + 1111 1101 = 1 0000 0001,加上进位等于 0000 0010;

优点: 解决了cpu减法运算问题

缺点: 0有两种表示方式,1111 1111(-0) 和 0000 0000(+0),需要额外“循环进位”硬件帮助运算。

3. 补码(twos’ complement)

反码虽然解决了原码无法运算的问题,但是反码出现了+0和-0的问题,并且需要循环进位的方式进行运算,增加了额外的开销。于是又出现了这神奇的补码,解决了反码的问题。

正数补码与原码相同,负数的补码,数值位取反(反码)后+1。
1的补码为 0000 0001, -1的补码为 1111 1111;

计算规则:先算出反码,然后反码再加1。
但是,补码有一个规则外的数字,那就是-128 (1000 0000),取代了原本-0的位置,变为-128。这个数字无法无法通过上述计算规则算出来的。因为根本就没有-128这个原码, 8位二进制原码的取值范围最小是-127。而这个-128恰好取代了反码中的-0,解决了反码出现两个0的问题。(所以为什么byte的取值范围是 -128~127的原因在这里)

我们来试一下补码的加减运算:
4 - 2 = 1000 0100 + 1111 1110 = 1 0000 0010 最高位直接舍去,刚好等于2, 不需要做循环进位操作。

3. 补码的原理

为什么补码能这么巧妙实现了正负数的加减运算?
涉及一些数学知识,学渣看不懂,脑壳疼,请自行翻阅。“补码”的数学原理

4. 浮点类型的取值范围,IEEE754

IEEE 754 标准是IEEE二进位浮点数算术标准的编号。

PS:篇幅太长,不是重点,先跳过,以后有空回来写。

猜你喜欢

转载自blog.csdn.net/u010386612/article/details/79875298