前言
受众:新手?零基础突击期末?(也许吧,定位不准,也许谁都不适合,写个乐子)
机器数是指真值按照某种编码方式进行编码后的数值。真值是实际的数值,而机器数则是这个数值在计算机内部的二进制表示。机器数分为无符号数和有符号数两种。无符号数只表示数值本身,而有符号数则需要一个符号位来表示正负。本文以有符号数介绍为主。
无符号数请参考:链接: 无符号数
正文开始
原码,反码,补码
原码:对于正数,原码就是其绝对值对应的二进制数,符号位为0;对于负数,原码也是其绝对值对应的二进制数,符号位为1
反码:对于正数,反码与原码相同;对于负数,反码是其绝对值的原码按位取反。例如,真值+1010的反码为0,1010;真值-1010的反码为1,0101
补码(简化减法运算而引入):对于正数,补码与原码相同;对于负数,补码是其绝对值的原码按位取反后加1。
移码:同一数值的移码和补码,除了符号位相反,即移码是正数变为1,负数变为0,其他各位同补码相同。作用:能直观反应数值的大小(就是说不用先去判断这个数是正是负,数值上哪个大就是哪个大)
相互转换
原转补:
法1.符号位不变,数值部分取反加1
法2.符号位不变,自低位向高位(自右向左),第一个1及其右边的0保持不变,其他数值位全部取反
补转原:
法1.符号位不变,减1再取反
法2.补码的补码即是原码,对补码按求补的方式再次求补可得原码
定点数表示
太简单了
定点数是指小数点位置固定的数,分成定点小数和定点整数
定点小数表示范围
(这里的n是数值位位数,不包括符号位)
原码:
- 正数最大0.1111111…即1-2-n
- 正数最小0.0000001…即2-n
- 负数绝对值最大1.1111111…即-(1-2-n)
- 负数绝对值最小1.0000001…即-2-n
补码: - 正数最大0.1111111…即1-2-n
- 正数最小0.0000001…即2-n
- 负数绝对值最大1.0000000…即-1
- 负数绝对值最小1.0000001…即-2-n
定点整数表示范围
(这里的n是数值位位数,不包括符号位)
原码:
- 正数最大01111111…即2n-1
- 正数最小00000001…即1
- 负数绝对值最大11111111…即-(2n-1)
- 负数绝对值最小10000001…即-1
补码: - 正数最大01111111…即2n-1
- 正数最小00000001…即1
- 负数绝对值最大10000000…即-2n
- 负数绝对值最小10000001…即-1
对于定点数而言,原码和反码的表示范围相同滴,且都关于0对称
而补码相对而言可以多表示一个最“负”的数,如-2n(整数)和-1(小数)
个人理解:
因为原码表示0有1000…和0000…,反码有1111…和0000…,都有两种,而补码只用0000…表示0,在位数相同的情况下,0,1的组合数的个数相同,所以补码会多一个数用来表示最“负”的数
浮点数表示
基本格式
规格化格式
尾数范围:
1
2
\frac{1}{2}
21
≤
\leq
≤
∣
M
∣
| M |
∣M∣ < 1
原码尾数:
- 正数:0.1XXX
- 负数:1.1XXX
补码尾数: - 正数:0.1XXX
- 负数:1.0XXX
对于补码负数尾数范围: 1 2 \frac{1}{2} 21 < ∣ M ∣ | M | ∣M∣ ≤ \leq ≤ 1
-0.5的原码是1.1000…,是规格化的
但-0.5的补码1.1000…,是非规格化的,需要左规一位
变成1.000…X 2-1才是规格化的
转非规格化为规格化
通过左移或者右移尾数,将尾数转化为标准格式
- 左移一位,相当于将尾数乘以2,阶码对应减一,称为左规
- 右移一位,相当于将尾数除以2,阶码对应加一,称为右规
IEEE754标准
- 单精确度float:32位,包括1位符号位、8位指数位(移码)和23位尾数位(原码)。
- 双精确度double:64位,包括1位符号位、11位指数位(移码)和52位尾数位(原码)。
注意点:
- 一般的移码偏置值是2n,但IEEE754中,移码的偏置值是2n-1,如float偏置值是127,double偏置值是1023(n是数值位位数,不包括符号位)
- 尾数隐含1,IEEE 754标准规定,浮点数的尾数部分采用原码表示,并且在最高有效位(即最左侧位)之前隐含了一个1
原因:浮点数尾数采用原码表示,数值位最高位总是1,为了节省存储空间,使得尾数部分能够表示更多的有效数字,故采用尾数隐含1表示
- 特殊值:
- 阶码为0,尾数为0,表示机器0
- 阶码为全1(如float阶码为255),尾数为0,表示 + ∞ +\infty +∞或者 − ∞ -\infty −∞(取决于符号位)
题目
来写题目,具体体会下
题1
float型数据通常用IEEE754单精度浮点数格式表示,若编译器将float型 变量x分配在一个32位浮点寄存器FR1中,且x=-8.25,则FR1的内容是(十六进制)()
A. C1C2 0000H
B. C184 0000H
C. C104 0000H
D. C242 0000H
答案: C
解:
-8.25,是负数,所以ms=1,
8.25二进制1000.01=1.00001 X 23(小数点前的1是数值,是要隐含的1,不是符号位,符号位已经处理过了)
尾数数值部分(共23位,不够则在后面补0):000 0100 0000 0000 0000 0000
阶码部分:3 + 127(偏置值)= 129 = 128 + 2=1000 0010
填入对应位置得1100 0001 0000 0100 0000 0000 0000 0000,即C104 0000H,故选C
题2.
对于二进制数 1011 1110 0110 0000 0000 0000 0000 0000,表示一个IEEE754标准的单精度浮点数,其真值是多少?
解:
符号位为1,负数
阶码部分0111 1100,表示124,则对应指数=124-127=-3
尾数部分110 0000 0000 0000 0000 0000 ,有隐含1, 所以是1.110,即1.75
所以是1.75 X 2-3