一言
爱和很多东西一样,都是先用直觉发现,再用一生去证明的。——枘凿的半截短诗
计算机系统基础笔记:第二章:数据机器级的表示和处理
本文最后更新于 510 天前,其中的信息可能已经有所发展或是发生改变。

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进制之间的转换

  1. R进制数转换为十进制:按权值展开:

  2. 十进制数转换为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

例:求真值的补码:

  1. 步骤:先转换为2进制

  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的值是多少

  1. 先将X转换为2进制: 1011 1110 1110 00000

  2. 然后分组 第一位是符号位,第二位到第九位是阶码,后边是尾数:1 0111 1101 11000000000.....(23位)

  3. 阶码转换为十进制:0111 1101B=125

  4. 减去偏移量,得到原始阶码:125-127=-2

  5. 计算尾数1100000....B=0.75,加上隐含位:1+0.75=1.75

  6. 真值=-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这个地址上

  • 字节交换问题:因为不同机器采用的方式不同,所以在系统间进行通信会有所不同,所以我们要在通信时,要进行顺序转换

暂无评论

发送评论 编辑评论

|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇