什么是数据表示?-- 概念
硬件能够识别、引用的数据类型
常见的数据表示方法有哪些?-- 分类
标识符是设置在数据之前的,而描述符和数据是单独分开的
标识符数据标识就是:类型+数据,比如:int 10
好处:
对于指令系统来说设计更高效简洁了,对于编译系统来说编译更加简洁高效了,对于调试和开发的时候也会方便不少,对于硬件来说,数据类型的转换更有利了
一致性,能更直观的看到错误并且进行排查。所以从宏观角度来说,运行速度更快了
坏处:会多一位空间进行存储数据类型,从微观角度来说,多了一个步骤进行数据类型识别
对某一系列数据的统一描述,可以理解为一个单独的数组中存储了类型,长度,地址这三个值,然后根据这数组中的地址找到对应的那一系列的数据,而这些数据的类型,长度都符合那单独数组中的描述,如:[int,6,x0212],然后在地址x0212中找到这一个数组:[5,7,1,0,3,6],里面的数据均是int类型,数组长度为6位,并且在这个数据数组中,每个元素都不再使用标识符进行描述,这样存储更加高效
向量:
A = {a1,a2,....a6}
B = {b1,b2,....b6}
C = A + B
C = {a1+b1,a2+b2,.....a6+b6}
在软件中,向量相加的这种情况,一般使用for进行遍历相加,而在硬件中,则使用向量加这一条指令即可获得结果:[向量加,A,B,B]
如何确定引入哪些数据表示?-- 原则
从性价比的角度展开思考
成本
该数据引入后系统性能是否提高
该数据的利用率高不高
位数、数位和科学计数法。
数位:就是当前进制下的数字个数,比如十进制下101,数位是3
位数:某进制转为二进制后,一个数位所需要多少个二进制位才能表示。比如一个16进制转为2进制所需要的二进制位是log₂16 = 4个,而一个八进制转为二进制所需要的二进制位是log₂8 = 3个
总位数 = log₂N * 数位
整数和小数的进制转换
整数的进制转换:每次除以2,取余数
小数的进制转换:每次乘2,取整
浮点数在计算机中是怎样表示的?
- 半精度(16位)浮点数
- 单精度(32位)浮点数
- 双精度(64位)浮点数
- 单精度浮点数在计算机中的表示
浮点数表示方法是:符号位+阶码位+尾数位
根据IEEE 754规定浮点数每个位所给二进制位数如下:
半精度(16位)浮点数:1+5+10
单精度(32位)浮点数:1+8+23
双精度(64位)浮点数:1+11+52
记忆阶码数据,只需要记住半精度的是5位,后面的每一个阶段都加3即可
转换为二进制方式:
1. 分解为符号,指数(阶码),位数
2. 确定符号,如果是正,符号位为0,如果是负,符号位为1
3. 把数位的数值转为二进制数
4. 写成科学计数法
5. 偏移量
6. 计算出阶码值
7. 拿到尾数
8. 写成浮点数记录法
偏移量 = 2^(阶码位的值-1)-1
比如单精度中的阶码位为8,所以偏移量等于2^(8-1)-1 = 127
这个值是为了排除阶码为负数的情况,因为计算机系统结构只研究正数
阶码值计算 = log₂(偏移量+科学计数法的阶值)
以10.25做例子,转为单精度浮点数
1. 符号位为正,所以符号位是0
2. 10的二进制等于1010,而0.25二进制为0.01,所以10.25二级制数位1010.01
3. 科学计数法:1.01001*2^3
4. 计算偏移量:2^(8-1)-1 = 127
5. 计算阶码值:log₂(127+3) = 10000010
6. 写下尾数:01001000000000000000000,后面增加18个0,用来凑齐23位尾数
7. 写下完整的浮点数记录:
0 10000010 01001000000000000000000
如果上面这个数要还原为十进制的时候,默认整数就是1,所以直接加上尾数得1.01001,然后再把阶码值逆向计算,由10000010转为3,最终换算为1.01001*2^3,然后再转为整数得到10.25
浮点数尾数相关的计算
非负阶
正尾数,规格化
只有尾数和进制有关
浮点数位数下溢处理方式
ROM查表舍入法