计算机中的数值信息分成整数和实数两大类。整数不使用小数点,或者说小数点总是隐含在个位数的右边,所以整数也称为“定点数”,包含原码、反码、补码和移码。相应地,实数也称为“浮点数”。
正数 负数 原码 最高位为符号位0,其他位为真值的二进制。 最高位为符号位1,其他位为真值的二进制。 反码 等于原码。 按原码除符号位外,其他位取反。 补码 等于原码。 等于反码+1 或者 求(2机器字长-负数的绝对值)的原码。 移码 补码的符号位取反。 补码的符号位取反。
1. 原码
最高位是符号位,0表示正号,1表示负号,其余的n-1位表示数值的绝对值(真值)。
数值 | +0 | -0 |
---|---|---|
原码(按8位二进制示例) | 0 0000000 | 1 0000000 |
数值 | +2 | -2 |
原码(按4位二进制示例) | 0 010 | 1 010 |
原码运算——加法
运算 | 数值 | 原码 | 原码转十进制 |
---|---|---|---|
1 | 00000001 | 1 | |
+ | 2 | 00000010 | 2 |
= | 3 | 00000011 | 3 |
原码运算——减法
运算 | 数值 | 原码 | 原码转十进制 |
---|---|---|---|
1 | 00000001 | 1 | |
+ | -1 | 10000001 | -1 |
= | 0 | 10000010 | -2 |
注意,计算机中减法相当一个正数加上一个负数,原码减法出现问题,一个数加上它本身的相反数不等于0,于是反码登场。
2.反码
正数的反码,等于原码。
负数的反码,按原码除符号位外,其它位取反。
数值 | +0 | -0 |
---|---|---|
原码(按8位二进制示例) | 0 0000000 | 1 0000000 |
反码(按8位二进制示例) | 0 0000000 | 1 1111111 |
数值 | +2 | -2 |
原码(按4位二进制示例) | 0 010 | 1 010 |
反码(按4位二进制示例) | 0 010 | 1 101 |
之前原码中减法出现问题,一个数加上它本身的相反数不等于0,我们现在用反码再试一下。
运算 | 数值 | 原码 | 反码 | 反码转原码转十进制 |
---|---|---|---|---|
1 | 00000001 | 00000001 | 1 | |
+ | -1 | 10000001 | 111111110 | -1 |
= | 0 | - | 11111111 | -0 |
反码相加的最后结果11111111,要先转成原码(即除符号位外的相反数)为10000000,原码再转十进制,最终结果为-0(负零也是零,算是对了吧!)。
那么,如果(-1)+(-3)结果是多少?
运算 | 数值 | 原码 | 反码 | 反码转原码转十进制 |
---|---|---|---|---|
-1 | 10000001 | 11111110 | -1 | |
+ | -3 | 10000011 | 11111100 | -3 |
= | -4 | - | 11111010 | -5 |
注意,两个不同负数值相加,采用反码运算的结果也不正确,于是补码登场。
3.补码
正数的补码,等于原码。
负数的补码,等于反码+1。
数值 | +0 | -0 |
---|---|---|
原码(按8位二进制示例) | 0 0000000 | 1 0000000 |
反码(按8位二进制示例) | 0 0000000 | 1 1111111 |
补码(按8位二进制示例) | 0 0000000 | 0 0000000 |
数值 | +2 | -2 |
原码(按4位二进制示例) | 0 010 | 1 010 |
反码(按4位二进制示例) | 0 010 | 1 101 |
补码(按4位二进制示例) | 0 010 | 1 110 |
负数还有一种计算补码的方法,公式:负数的补码 =(2机器字长 - |负数的绝对值|)的原码。
例如,若机器字长为4,求-2的补码。
套入公式过程如下:
( 24 - 2) = 14,
14的原码 = 1110,
-2的补码 = 1110。
之前反码计算不同负数值相加出现问题,我们现在再用补码试一下。
运算 | 数值 | 原码 | 反码 | 补码 | 补码转十进制 |
---|---|---|---|---|---|
-1 | 10000001 | 11111110 | 111111111 | -1 | |
+ | -3 | 10000011 | 11111100 | 11111101 | -3 |
= | -4 | - | - | 11111100 | -4 |
补码转十进制的过程如下:
补码 | 11111100 |
---|---|
补码的反码 | 10000011 |
补码的反码的补码 | 10000100 |
补码的反码的补码转十进制 | -(1*22) = -4 |
计算机中均采用补码进行加减运算。
4. 移码
移码就是补码的符号位取反。 主要用在表示浮点数的指数(阶码)。
数值 | +2 | -2 |
---|---|---|
原码(按4位二进制示例) | 0 010 | 1 010 |
反码(按4位二进制示例) | 0 010 | 1 101 |
补码(按4位二进制示例) | 0 010 | 1 110 |
移码(按4位二进制示例) | 1 010 | 0 110 |
5.浮点数
实数又称浮点数,通常是既有整数部分又有小数部分的数,整数和纯小数只是浮点数的特例。 例如:3.1415926,-9527,0.01579等都是实数。
任何一个浮点数都可以表示一个乘幂和一个纯小数的乘积。 例如:
3.1415926 = ( 0.31415926 ) * 101
-9527 = ( -0.9527 ) * 104
0.01579 = ( 0.1579 ) * 10-1
其中,乘幂中的指数部分用来指出浮点数中小数点的位置,括号括出的是一个纯小数。 二进制数的情况完全相同,例如:
10101.01 = ( 0.1010101 ) * 2101
0.000111 = ( 0.111 ) * 2-11
- 浮点表示法: F = 尾数 * 基数指数
尾数: 是一个纯小数,用补码表示,位数决定数的有效精度,位数越多精度越高。
基数: 取进制数,即十进制基数为10,二进制基数为2,八进制基数为8,十六进制基数为16。
指数: 又称阶码,是一个整数,用移码表示,位数决定数的表示范围,位数越多范围越大。
浮点数运算过程先后分为:对阶、尾数计算 和结果格式化。
对阶就是将指数对齐,原则是从小向大看齐,通过较小数的尾数向右移动实现。
运算 | 浮点数 | 浮点表示法 | 对阶后的浮点数 |
---|---|---|---|
3141.5926 | 0.31415926*104 | 0.0031415926*106 | |
+ | 314159.26 | 0.31415926*106 | 0.31415926*106 |
= | - | 0.3173008526*106 |