2.1 数制和编码
信息的二进制编码
机器级数据
数值数据
无符号整数
带符号整数(能表示正负)
浮点数(实数)
非数值数据(不表示大小)
逻辑数(0或1)
字母、汉字
计算机内部的信息都是用二进制进行编码,为什么?
制造两个稳定态的物理器件容易(脉冲(有/无),正负级)
二进制计数规则简单
便于逻辑运算
方便的用逻辑电路实现算术运算
真值与机器数
机器数:用0/1编码的01序列
真值:现实中真正的值
数值数据的表示
八进制和十六进制的引入是为了二进制的简便表示,二进制太繁琐,所以引入八进制和十六进制
数值数据表示的三要素
进位计数值
- 十进制、二进制、十六进制、八进制
定、浮点表示
定点整数
浮点数(一个定点小数和一个定点整数表示)
如何使用二进制编码→用二进制表示正负
- 原码、补码、移码、反码(不常用)
二进制计数值
一个二进制数,每一位都有自己的权值,和十进制一样
在十进制中:
$例如:
同理在二进制中:100101.01表示
- 2成为基数,也就是2进制的那个2,每一位只能用2个数字符号,2^i称为第i位上的权
而十六进制,是在0到9的基础上多了A、B、C、D、E、F 6位,分别表示10、11、12、13、14、15
一般的,二进制的数会在后边加’B‘如: 100111B
十六进制会在前面加’0x‘或者后缀加’H‘ 如 0xAC45108或者AC45108H
八进制是在后缀加’O‘。
十进制与R进制之间的转换
R进制数转换为十进制:按权值展开:
十进制数转换为R进制数
整数部分:除基取余(想不懂的话想想十进制就行),最后将余数反向排列
- 还有个简便方法:29=2^4+2^3+2^2+2^0,所以结果为11101,因为第0、2、3、4位上都有2,所以该位置上是1,第1位上没有,所以为0
小数部分:乘基取整,最后将余数正向排列
这里小数部分可能总得不到0,此时得到一个近似值,浮点数不能做等于比较。
小数点位置怎么表示?
计算机中只能通过约定小数点的位置来表示
小数点位置约定在固定位置的数称为定点数
可浮动的称为浮点数
定点小数用来表示浮点数的尾数位置
定点整数用来表示整数
十六进制和二进制之间的转换
十六进制和二进制之间的转换是将每四个数作为一组进行转换,例如:10011010转换为16进制
就是1001为一组,他表示9,1010表示10,也就是A,所以结果就是9A(若二进制不是4的倍数,则在最前面补零)。同理,十六进制转换二进制也一样,每一个数字用4个数字01序列表示。
2^n转16进制的快速转换。
2^n=10000...00(n个0)
n=i+4j(将n%4)得到的余数就是有效的尾数。其他都为0
例:n=11→11=3+2*4→2^11=800H
原码、补码、反码、移码
原码:最高位为符号位,符号位为0表示正,符号位为1表示负。
缺点:
0的表示不唯一
加减运算不统一
需要对符号位额外处理
反码:正数和原码相同,负数是在原码的基础上,除了最高位,其他位都取反---→现在已经不用反码表示机器数了
补码:正数和原码相同,负数是除最高位,其他位取反,然后加1(负数的补码变成原码也是取反+1)
移码表示:就是将数值加上一个偏执常数(bias),加完之后的数就是在机器中表示的数
$通常,编码数为n时,偏执常数取2^{n-1}或者2^{n-1} -1$
移码为了比较浮点数的阶而存在的
补码的原理:模运算
(钟表):钟表是一个模12系统:在钟表中,假设表是10点,要将他拨向6点,可以直接顺拨8格,也可以逆时针拨4格,这样,(10+8)mod12=(10-4)mod12, 则称8是-4对模12的补码,在这个模系统中,10+8就可以表示10-4.
补码的意义就是,可以用加法来算减法(+和-的统一),
所以一个负数的补码就等于将对应整数各位取反,末尾加1
补码的定义:
特殊数的补码:
机器数有n位:
[-1]补=2^n-0000…1=111.....1(n个1)
-0和+0的补码都为00000....0(n个0)
变形补码:双符号位,用于存放可能溢出的中间结果,例:1000的变形补码为01000
该数字真值的十进制表示为8,但是只有4位,如果常规表示的话,表示-0,但是变形补码就是溢出一位,表示+8
例:求真值的补码:
步骤:先转换为2进制
然后代入公式,或者各位取反,末尾加1(用这个就行)→从右向左遇到的第一个1前面各位取反。
例:-123的16位补码表示为( )。
-123转换为2进制为-0000000001111011
然后从右向左第一位1不变,其他各位取反
得到1111 1111 1000 0101,即:1111 1111 1000 0101B
例:求补码的真值
符号位为0,则为正数,数值部分相同
符号为1,为负数,数值各位取反,末位加1
例:补码01010110的真值为:+1010110=86
11010110的真值为-(00101010)=-42
2.2整数的表示
无符号整数
LSB(Least Significant Bit)最低有效位
MSB(Most Significant Bit)最高有效位
机器中字的排列顺序有两种方式:
高到低从左到右,LSB在最右边
高到低从右到左,MSB在最右边
一般采用第一种从左到右的方式排列
无符号数一般比带符号数大一倍。
带符号整数
通常用补码表示带符号整数
2.3浮点数的表示
概述
浮点数可以由一个二进制的定点小数和一个定点尾数表示
例:真值转机器数
先将112.5转为2进制:1110000.1B
然后将这个二进制数以科学计数法的方式表示
和十进制的科学计数法一样
$1.1100001×2^{6}$
6为阶码
浮点数要在阶码的基础上加偏移量
单精度浮点数的偏移量为127(1111111B),
6+127=133=1000101B :写到阶码上
最后的23位是尾数,写小数点后边的8位数字1100001,其他位置补零,因为整数部分的1是固定的,是尾数的隐藏位,所以只用23位就可以表示
所以112.5在计算机 以单精度浮点数表示的结果是以上
浮点数的范围由阶码的位数确定,精度由尾数的位数确定
双精度
8字节,64位
偏移量为1023(1111111111),阶码为11位,尾数为52位
范围:
正下溢和负下溢区域可以近似表示为0,尾数全为0也能为0
IEEE 754中规格化数的表示
现在通用计算机都采用IEEE754来表示浮点数
单精度:
符号位:1位
阶码范围为0000 0001(-126)——1111 1110(127)
阶码:8位
尾数:1+23位
偏执常数:127(1111111B)
双精度:
符号位:1位
阶码:11位
尾数:1+52位
偏执常数:1023(1111111111B)
例:机器数转真值
已知float型变量X的机器数为BEE00000H,求X的值是多少
先将X转换为2进制: 1011 1110 1110 00000
然后分组 第一位是符号位,第二位到第九位是阶码,后边是尾数:1 0111 1101 11000000000.....(23位)
阶码转换为十进制:0111 1101B=125
减去偏移量,得到原始阶码:125-127=-2
计算尾数1100000....B=0.75,加上隐含位:1+0.75=1.75
真值=-1.75*2^-2=-0.4375
IEEE 754中特殊数的(非规格化数)表示
0的表示:全零指数和全零尾数表示0
- 0 0000000 00000000000000000000000
+∞和-∞的表示:浮点数的正上溢和下溢出表示正无穷和负无穷(全1指数和全零尾数)
+∞:0 11111111 00000000000000000000000
-∞:1 11111111 00000000000000000000000
一个非0数除以0可以表示正无穷
非数(NaN):例如:-4.0、0/0等 Not a Number
- 表示:全1阶码和非零尾数:0 11111111 01000000000000000000000
非规格化数:全零指数(阶码)和非零尾数
浮点数精度的例
当在机器中输入一个不可表示数据时,机器将其转换为最邻近的可表示数
非数值数据的编码表示
逻辑数据的编码表示
用一位表示真假,N位表示多个逻辑数据,也就是逻辑位串
运算按位进行
识别:逻辑数据也是一段01序列,计算机按照指令识别(操作码)
西方字符编码表示
- 表示:ASCII码
汉字及国际字符的表示:
GB2312-80字符集
由三部分组成
①字母、数字和各种符号,包括英文、俄文、日文平假名与片假
名、罗马字母、汉语拼音等共687个②一级常用汉字,共3755个,按汉语拼音排列
③二级常用汉字,共3008个,不太常用,按偏旁部首排列
汉字的区位码
码表由94行、94列组成,行号为区号,列号为位号,各占7位
指出汉字在码表中的位置,共14位,区号在左、位号在右
汉字的国标码
每个汉字的区号和位号各自加上32(20H),得到其“国标码”
国标码中区号和位号各占7位。在计算机内部,为方便处理与存储,前面添一个0,构成一个字节
多媒体信息的表示
图形、图像、音频、视频等信息在机器内部也用0和1表示
图形用构建图形的直线或曲线的坐标点及控制点来描述,而这些坐标点
或控制点则用数值数据描述图像用构成图像的点(像素)的亮度、颜色或灰度等信息来描述,这些
亮度或颜色等值则用数值数据描述音频信息通过对模拟声音进行采样、量化(用二进制编码)来获得,因
此量化后得到的是一个数值数据序列(随时间变化)视频信息描述的是随时间变化的图像(每一幅图像称为一帧)
一音乐信息(MIDI)通过对演奏的乐器、乐谱等相关的各类信息用0和
1进行编码来描述
多媒体信息用一个复杂的数据结构来描述,其中的基本数据或者是数
值数据,或者是用0/1编码的非数值数据
数据宽度和存储容量的单位
数据的基本宽度
比特(bit,位):是计算机中处理、存储、传输信息的最小单位
最基本计量单位:Byte(字节)
现代计算机中,存储器按字节编址
字节事最小的寻址单位
字(word)
字和字长概念不同
字长指数据通路的宽度:数据通路指CPU内部进行数据运算、存储和传送的部件,这些部件的宽度需要一致才能相互匹配
字表示被处理信息的单位,用来度量数据类型的宽度
字和字长的宽度可以一样,也可不同
数据量的度量单位:
- 存储二进制信息时的度量单位比字节或字大得多
注:
B和b不一样:B是字节(Byte),b是比特(bit)
k和K不一样:k指10^3,K指2^10(1024),而M、G、T都是大写,主要看上下文
C语言中数据类型的宽度(单位:字节)
所以同类型数据并不是所有机器都采用相同宽度,分配的字节数随ISA、机器字长和编译器的不同而不同
数据的存储和排列顺序
一个基本数据可能会占多个存储单元
例:int型变量x=-10,X的存放地址为100,其机器数FFFFFFF6H,占4个单元
变量的存放地址100表示是最小地址。
大端方式:MSB所在的地址是数的地址,也就是FF在100这个地址上
小端方式:LSB所在的地址是数的地址,也就是F6在100这个地址上
字节交换问题:因为不同机器采用的方式不同,所以在系统间进行通信会有所不同,所以我们要在通信时,要进行顺序转换