文章目录
一、定点数(原码、反码、补码)
1.1 基本介绍
定点数指的是小数点固定的存储方式,因为小数点固定,所以不需要额外使用存储空间存储小数点,只需要约定好即可。计算机中定点数有两种类型:
- 定点小数。如果是有符号数,约定小数点在符号位的后面,即: +0.XXXXXX,如果是无符号数,约定小数点在最前边,即: 定点小数的是类似:0.XXXXXX
- 定点整数。约定小数点在最后边。定点整数是类似:XXXXXX.0这种形式
1.2 定点数的机器码表示
对于一个有符号数,将数的数符连同数一起 编码,并作为数的一部分同数一起参与运算,这种连同数符一起进行编码的 表示形式 称为 机器数或机器码,根据运算方法的需要,数的机器码往往会不相同,常见的有 原码、反码、补码和移码。
机器数第一位为符号位,所以机器数的形式值不等于真正的数值。如有符号数 10000011,第一位为符号位,其真正数值为 -3 而不是形式值 131 (10000011转换成十进制等于131)
所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值
例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1
1.3 原码表示法
原码表示法是一种比较直观的 机器码表示法。
原码的最高位作为符号位,用 “0” 表示正号,用 “1” 表示负号,有效值部分用二进制数的 绝对值 表示。
1.对于定点小数:
设 [x]原 = x0x1x2x3…xn,其 n + 1 位,其中 x0 为符号位
小数最高位也就是符号位的真值为 20 = 1
如 10 进制数: +0.625,它的二进制表示是: +0.101.
用原码表示法就是: 0.101.
# 其实也就是二进制表示 +0.11 的数值本身.
---------
再如 10 进制数: -0.625,它的二进制表示是: -0.101.
用原码表示法就是: 1.101.
# 其实也就是二进制表示的 -0.11 进行如下运算: 2^0 - (-0.101) = 1 + |-0.101| = 1.101.
对于负数的定点小数的原码,规则也就是: 二进制表示去掉负号符号加 1
2.对于定点整数:
设 [x]原 = x0x1x2x3…xn,其 n + 1 位,其中 x0 为符号位
整数最高位也就是符号位的真值为 2n
如十进制数: +5,它的二进制表示是: +101.
用原码表示就是: 101.
# 其实也就是二进制表示的 +101 的数值本身.
---------
再如十进制数: -5,它的二进制表示是: -101.
用原码表示就是 1101.
# 其实也就是二进制表示的 -101 进行如下运算: 2^4 - (-101) = 2^4 + |-101| = 1011.
对于负数定点整数的原码,规则也就是: 二进制表示去掉负号符号加 2^n
综上,原码表示法就是去掉符号位,正数高位补 0,负数高位补 1,对于负数高位补 1 的理解可以是在其二进制表示的基础上,去掉符号(绝对值)加上 2n(n与二进制位数包含符号位个数相等)
&.对于真值 0,其原码有 正0和负0 之分,即 0 的原码不唯一。因此对于定点小数和定点整数,0 的表示各有两种形式:
1.4 反码表示法
反码的表示方法是:
- 正数的反码是其本身
- 负数的反码是在原码的基础上,符号位不变,其余位取反
1.对于定点小数:
设 [x]反 = x0x1x2x3…xn,其 n + 1 位,其中 x0 为符号位
如十进制数: +0.625,它的二进制表示是: +0.101.
原码表示法是: 0.101,因此补码也是 0.101.
# 也二进制数 +0.101 数值本身.
---------
再如十进制数: -0.625,它的二进制表示是: -0.101
原码表示法是: 1.101, 在些基础上除开符号位取外得到反码: 1.010.
# 原理是: (10.000 - 0.001) + (-0.101) = 1.111 - 0.101 = 1.010.
2.对于定点整数:
设 [x]反 = x0x1x2x3…xn,其 n + 1 位,其中 x0 为符号位
如十进制数: 5, 它的二进制表示是: +101.
原码表示是 101, 因此补码也是 101.
# 也就是二进制表示 +101 数值本身.
---------
再如十进制数: -5, 它的二进制表示是: -101.
用原码表示是 1101, 反码就是: 1010.
# 对于取反操作,我们可以发现的是一个二进制表示,如: 1100,取反后是: 0011,
它们相加的结果都会是: 1111, 1 的个数取取决于 1100 或 0011 的位数,而 1111 又等于 10000 - 1.
因此,1111 可以表示成 10000 - 1, 即 1111 = 10000 - 1, 十进制表示也就是: 2^n+1 - 1.
所以它与二进制表示的 -101 的关系是:
(10000 - 1) + (-101) = 1111 - 101.
(也可以理解成,其中 1_111(10000-1) 中的 111 给 101 完成取反,111 - 101 = 010,而首位 1 赋给其符号位,1 就是表示负号.)
综上,负数反码对原二进制数要完成的操作是(定点整数示例): 取相应位数表示的 1111(n+1位),其中 n 位完成取反操作(如: 111 - 010 = 101),首位 1 赋于其负号表示(负号用 1 表示).
对于定点整数(10000 - 1 = 1111),10000 就是 2^n+1,1 就是 2^0.
对于定点小数(10.000 - 0.001 = 1.111),10.000 是 2^0,0.001 是 2^-n
n 是二进制位包含符号位的个数.
1.5 补码表示法
正数的补码就是原码。负数的补码是 反码加1
1.对于定点小数
设 [x]反 = x0x1x2x3…xn,其 n + 1 位,其中 x0 为符号位
2.对于定点整数
设 [x]反 = x0x1x2x3…xn,其 n + 1 位,其中 x0 为符号位
负数补码的表示与反码的表示相似,只不过在其基础上加1,以定点整数为例:
反码的规则是: 10000 - 1 - 101 = 1111 - 101 = 1010,
而补码的规则为 10000 - 101 = 1111 +1 - 101 = 1111 - 101 + 1 = 1010 + 1.
1.6 各种机器码所表示的数的范围
二、浮点数(IEEE754标准)
目前,几乎所有的计算机都支持 IEEE 754 标准,它大大地改善了科学应用程序的可移植性。IEEE 754标准中 阶数用移码表示,尾数用原码表示。
对于一个任意进制数 N,均可表示成 N = M x RE,比如十进制数表示的23.67×10-2、0.68×103。其中:
- M 称为浮点数的尾数,用定点小数表示,值可正可负,尾数的符号就是浮点数的符号,尾数的位数决定了浮点数的表示精度;IEEE754 标准中尾数 M 用原码表示
- E 称为浮点数的阶码,即通常所说的指数,用定点整数表示,值可正可负,其位数决定了浮点数的表示范围;IEEE754 标准中阶码 E 用移码表示(也就是无符号数)
- R 称为浮点数阶码的基数,在二进制浮点数据表示中,R 的取值通常为2,由
于R的取值是默认的,因此,在浮点数的表示格式中省去了对 R 的表示.
IEEE754 两种常规格式:
在IEEE754标准中,一个规格化的32位浮点数x的真值可表示为:
X = (-1)s x (1.M) x 2E-127
其中,S、M、E分别为32位浮点数表示格式和存储格式中的数符、尾数和阶码。公式中的 E-127 表示浮点数 X 的指数 e,即 e=E-127 或 E=e+127。
&、关于 IEEE754 中的阶码为什么是 +127 而不是 +128?
1. 因为 8 个二进制位能表示指数的取值范围为 [-128,127],现在要将指数变成移码表示,即把区间 [-128,127] 正向平移到正数域。
2. 而阶码的范围只能是 [1,254],就是说阶码没有 0 与 255(全0和全1),因为 IEEE754 规定,全 1 是无穷大,全 0 是非规范数。
- 如果是 +128,反过来推,[1,254] -> [-127,126],那么 +128 的话最终指数能表示的范围是 -127~126
- 如果 +127,反过来推,[1,254] -> [-126,127],那么 +127 的话最终指数能表示的范围是 -126~128
综上,如果偏移量仍为 128 的话,则指数最大只能取到 126,显然会缩小浮点数能表示的取值范围。所以 IEEE754标准 规定单精度的阶码偏移量为 127.