ICS 与 8086 复习 02:进制转换 字符编码与字节序
内存中出现 41 00 00 00,它究竟是整数 65、字符 A,还是某条指令的一部分?这类题的关键,是先确定宽度、编码和排列方式,再计算数值。只看到一串十六进制数就下结论,往往会把几个独立问题混在一起。
本篇集中复习进制转换、数据单位、字符编码、大小端和位操作。有符号整数与浮点数分别留到下一篇和第四篇展开。
进制转换应当保留位权
二进制各位的权是 2 的整数次幂。小数点左边从 2^0 向上递增,右边依次是 2^-1、2^-2……。例如:
178.125 = 128 + 32 + 16 + 2 + 1/8
= 10110010.001B
= B2.2H
二进制转十六进制时,以小数点为界向左右每四位分组;整数端在左补零,小数端在右补零,因此 10110010.001B 应分为 1011 0010 . 0010。小数部分若左补零,会改变位权和真值。
十进制整数可以反复除二取余,再逆序排列;小数则反复乘二,顺序取整数部分。例如 0.625×2=1.25、0.25×2=0.5、0.5×2=1,得到 .101B。约分后分母只含因子 2 的有理数,才能在有限位二进制中精确表示;所以 1/8 可以,1/10 不行。
位宽和容量需要看单位
在本系列讨论的 x86 环境中,一字节为 8 位。x86 的 word 固定为 16 位、doubleword 为 32 位,不能因为使用 32 位处理器就把 word 改成 32 位。数据类型大小、寄存器宽度、地址位数也不是同一个概念。
容量题先明确倍率。课件沿用了“KB 按 1024 算”的教学习惯;题目这样规定时应按其约定计算。严谨表示中,1 KiB=1024 B,1 kB=1000 B;b 表示 bit,B 表示 byte。二进制与十进制前缀的定义可核对 NIST 的二进制前缀说明。
例如,按十进制标注的 100 Mb/s,理想换算为 12.5 MB/s,不是 100 MB/s;实际文件传输还会受到协议等因素影响。若题目问 16 根地址线可覆盖多少字节,还必须有“按字节编址且地址线均参与编址”的前提,才能得到 2^16 B=64 KiB。
端序决定多字节对象的排列
假定一个 32 位整数的位模式为 12345678H,从地址 1000H 开始存放:
| 地址 | 小端存储 | 大端存储 |
|---|---|---|
| 1000H | 78H | 12H |
| 1001H | 56H | 34H |
| 1002H | 34H | 56H |
| 1003H | 12H | 78H |
小端是低有效字节放低地址,大端是高有效字节放低地址。两者的对象起始地址都是 1000H。端序改变字节排列,不改变该对象的抽象数值,也不要求颠倒每个字节内部的位。
读转储题时,先画地址递增方向,再按数据宽度取连续字节。x86 中从 1001H 读取一个 16 位字,得到的是 3456H。如果只读取一个字节,则没有多字节端序问题。
指令也应按编码规则逐字段读取。不能把整条机器指令所有字节一概倒序;其中的立即数、位移等多字节字段遵循各自的编码规定。
字符编码与数值编码要分开
ASCII 中,'0' 对应 30H,'9' 对应 39H,'A' 对应 41H。数值 5 的一个字节可以是 05H,字符 '5' 则是 35H。所以把小整数转换成十进制数字字符,常见做法是加 '0',但只适用于 0 到 9。
传统汉字编码题应注明体系。在课件采用的 GB2312 双字节区位表示中,若“区”和“位”是十进制编号,分别加十进制 32,得到相应国标交换码的两个字节;在常见 EUC-CN 机内表示中,再分别置最高位。
以区位 20、83 为例:
20 + 32 = 52 = 34H
83 + 32 = 115 = 73H
国标交换码两个字节:34H 73H
常见机内表示两个字节:B4H F3H
这里的 20 和 83 不能误当成十六进制。也不能把这一算法套到 UTF-8;汉字占几个字节取决于具体编码,“每个汉字固定两个字节”并非普遍规则。输入码解决怎样输入,字符编码解决怎样存储,字模或轮廓解决怎样显示,它们各自承担不同任务。
位运算如何提取信息
给定 y=2C0BH,提取高字节要先明确所需结果。如果要高字节仍留在原位,计算 y & FF00H 得 2C00H;如果要得到 0 到 255 的数值,应计算 (y >> 8) & FFH,结果为 2CH。
| 目的 | 常用形式 |
|---|---|
| 保留选中的位 | x & mask |
| 将选中的位置 1 | x | mask |
| 翻转选中的位 | x ^ mask |
| 将选中的位清零 | x & ~mask |
& 与 && 的区别也应通过操作对象理解。若 x=2、y=1,则 x&y=0,而 x&&y=1;前者逐位运算,后者判断两个值是否都非零,并具有短路求值规则。位操作题通常优先使用无符号类型,能更直接地表达位串意图。
自测与简答
0.375的二进制是什么?能否有限表示?- 小端内存从低地址起是
01 00 FF FF,按 32 位补码整数解释是多少? y=ABCDH时,保留低字节、把高字节清零,结果是多少?
简答: ① .011B,可以。② 位模式为 FFFF0001H,有符号真值为 -65535。③ y & 00FFH = 00CDH。答第二题必须同时使用端序和补码规则;只有字节排列还不足以确定有符号真值。
来源定位
主要依据 2.数据的机器级表示与处理-V1.0.pptx 第9—20页的进制与表示三要素、第106—127页的字符、宽度、存储与端序、第129—135页的位操作。GB2312 区位例据第110—113页重述;现代字符编码的适用范围和容量前缀说明用于限定原结论。
讨论这篇文章
关于《ICS 与 8086 复习 02:进制转换 字符编码与字节序》的补充、不同意见或延伸话题,都可以留在这里。
滚动到这里时自动载入留言。