一、真值、机器数(原码、反码、补码)定义
真值 | 一般书写表示的数 | X=-110 0111,y=110 0110 | |
机器数 | 原码 | 符号位+数值 | [x]原=1110 0111,[y]原=0110 0110 |
反码 | 正数的反码是符号位0+数值; 负数的反码是符号位1+数值各位取反 | [x]反=1001 1000,[y]反=0110 0110 | |
补码 | 正数的补码是符号位0+数值; 负数的补码是符号位1+数值各位取反后,最低位加1 | [x]补=1001 1001,[y]补=0110 0110 |
二、0的机器数
真值 | 000 0000 | -000 0000 | |
机器数 | 原码 | [+0]原=0000 0000 | [-0]原=1000 0000 |
反码 | [+0]反=0000 0000 | [-0]反=1111 1111 | |
补码 | [+0]补=0000 0000 | [-0]补=0000 0000 |
注:0的原码、反码表示方法有两种,0的补码表示方法唯一
三、表示范围
机器数 | 原码 | 无符号 | 0000 0000~1111 1111 | 0~255 |
有符号 | 1111 1111~0111 1111 | -127~127 | ||
反码 | 有符号 | 1000 0000~0111 1111 | -127~127 | |
补码 | 有符号 | 1000 0000~0111 1111 | -128~127 |
注:建议记住上表结论即可
1、1000 0000反=1111 1111原=-127
1111 1111反=1000 0000原=-0
2、1000 0000补=1111 1111反=1000 0000原=-128发生了溢出,不能影响符号位 ???
1111 1111补=1111 1110反=1000 0001原=-1
机器数 | 原码 | 无符号 | 0~2^n-1 |
有符号 | -2^(n-1)+1~2^(n-1)-1 | ||
反码 | 有符号 | -2^(n-1)+1~2^(n-1)-1 | |
补码 | 有符号 | -2^(n-1)~2^(n-1)-1 |
注:建议记住上表结论即可
没有指明编码方式,计算机n位二进制无符号数的范围是0~2^n-1,有符号数的范围是-2^(n-1)+1~2^(n-1)-1
四、总结
1、原码:
0表示方法不唯一;
计算结果会错误: 1 - 1 = 1 + (-1) = 0000 0001(原 )+ 1000 0001(原 )= 1000 0010(原) = -2
2、反码:
0表示方法不唯一;
计算结果正确: 1 - 1 = 1 + (-1) = 0111 1110(反 )+ 1111 1110(反 )= 0000 0000(反) = 0
3、补码:
实现0表示方法的唯一性;
减法用加法形式来运算;
能多表示一个最小数(如8位,范围是-128~127,规定用1000 0000来表示-128,最小数逻辑上没有对应的原码)