1. 给定n位有符号二进制数,则它能表达的数值范围为 -2^(n-1) ~ (2^(n-1))-1, 为什么负整数比正整数多一个呢?
比如8位,最高位为符号位,所以:
正数表示的范围为 0~(2^7-1) => 0~127, 0表示为 0000000
负数也可以从 10000000 ~ 11111111 ,此时出现了-0,而-0没有任何价值,就将-0看成-2^(7-1), 即-0=> -128
2. 原码: 正数-》本身,符号位为0 负数-》本身,符号位为1
反码: 正数-》本身, 负数-》符号位不变,数据位各位取反
补码:正数-》本身, 负数-》符号位不变,数据位各位取反,再加1
补码求法: 从右边复制位,直到有1被复制,然后,反转其余的位。
3. 为什么要使用补码?
计算机对符号位的识别很困难,于是让符号位也参加运算,一个正数减去一个数相当于加上一个负数,即 1-1 = 1+ (-1)=0, 所以机器只有加法没有减法。
a. 使用原码
1-1 = 1+(-1) = [00000001]原 + [10000001]原 = 无法确定符号位
b. 使用反码
1-1 = 1+(-1) =[00000001]反 + [11111110]反 = [11111111]反 = [10000000]原 = -0
对于0而言,存在+0和-0,而0带符号没有任何意义,而且会有[00000000]原 与[10000000]原两个表示
c. 使用补码
1-1 = 1+(-1) = [00000001]补 + [11111111]补 = [00000000]补 = [00000000]原 = 0
这样 -0就不存在了,可以用 [10000000]表示-128
-1 + (-127) = [11111111]补 + [10000001]补 = [10000000]补 = -128, 注意-128不存在原码和反码表示。
4. 补码正确性的数学原理
同余数理论,好比时钟:
回拨2小时 = 前拨10小时
回拨4小时 = 前拨8小时
回拨5小时= 前拨7小时
5. 浮点数转换成2进制
0.4 =》0.01110001 无穷