数制与编码
“转换”的概念在数据表示中的反映
信息的二进制编码
- 机器级数据分两大类
- 数值数据:无符号整数、带符号整数、浮点数(实数)
- 非数值数据:逻辑数(包括位串)、西文字符和汉字
- 计算机内部所有信息都用二进制(即:0和1)进行编码
- 用二进制编码的原因
- 制造二个稳定态的物理器件容易(电位高/低,脉冲有/无,正/负极)
- 二进制编码、计数、运算规则简单
- 正好与逻辑命题真/假对应,便于逻辑运算
- 可方便地用逻辑电路实现算术运算
- 真值和机器数 ( 非常重要的概念!) 机器数:用0和1编码的计算机内部的0/1序列
- 真值:真正的值,即:现实中带正负号的数 例:unsigned short型变量x的真值是127,其机器数是多少? 127=27-1,其机器数为0000 0000 0111 1111
数值数据的表示
- 数值数据表示的三要素
- 进位计数制
- 定、浮点表示
- 如何用二进制编码 即:要确定一个数值数据的值必须先确定这三个要素。 例如,20137564的值是多少?
- 进位计数制
- 十进制、二进制、十六进制、八进制数及其相互转换
- 定/浮点表示(解决小数点问题)
- 定点整数、定点小数
- 浮点数(可用一个定点小数和一个定点整数来表示)
- 定点数的编码(解决正负号问题)
- 原码、补码、反码、移码 (反码很少用)
进制数
十进制数,每个数位可用十个不同符号0,1,2,…,9来表示,每个符号处在十进制数中不同位置时,所代表的数值不一样。 例如,2585.62代表的值是: 2585.62 = 2×103+5×102+8×101+5×100+6×10-1+2×10-2 • 一般地,任意一个十进制数 D=dndn-1 ... d1d0 . d-1d-2 ... d-m (m,n为正整数) • 其值可表示为如下形式: V(D) = dn×10n + dn-1×10n-1 + ...+ d1×101 + d0 ×100 + d-1
×10-1 + d-2 ×10-2+...+d-m ×10-m 其中,di(i=n,n–1, ... ,1,0, –1, –2, ... –m)可以是 0,1,2,3,4,5,6,7,8,9这10个数字符号中的任何一个; “10”称为基数(base),它代表每个数位上可以使用的不同数字符 号个数。10i 称为第i位上的权。运算时, “逢十进一”。
二进制数,每个数位可用两个不同符号0和1来表示,每个符号处在不同位置时,所代表的数值不一样。 例如,100101.01代表的值是: (100101.01)2 = 1×25 + 0×24+ 0×23 + 1×22 + 0×21 + 1×20+ 0×2-1 + 1×2-2 = 37.25 • 一般地,任意一个二进制数 B=bnbn-1 ... b1b0 . b-1b-2 ... b-m (m,n为正整数) • 其值可表示为如下形式: V(B) = bn×2n + bn-1×2n-1 + ...+ b1×21 + b0 ×20 + b-1 ×2-1 + b-2 ×2-2+...+b-m ×2-m 其中,bi(i=n,n–1, ... ,1,0, –1, –2, ... –m)可以是0或1 “2”称为基数(base),它代表每个数位上可以使用的不同数字符号个数。2i 称为第i位上的权。 运算时,“逢二进一”。后缀“B”表示二进制数,如01011010B
R进位计数制
八进制和十六进制
日常生活中用十进制表示数值,计算机中用二进制表示所有信息!
那为什么还要引入 八进制 / 十六进制呢?
八进制 / 十六进制是二进制的简便表示。便于阅读和书写! 它们之间对应简单,转换容易。
在机器内部用二进制表示,在屏幕或其他设备上表示时,转换为八 进制/十六进制数,可缩短长度。
八进制:Octal (用后缀“O”表示)
十六进制:Hexadecimal (用后缀“H”,或前缀“0x”表示)
例:1010 1100 0100 0101 0001 0000 1000 1101B可写成
0xac45108d 0xAC45108D 或 ac45108dH AC45108DH 或 8进制:25421210215O
010 101 100 010 001 010 001 000 010 001 101
现代计算机系统多用十六进制表示机器数
进制数之间的转换
十进制数与二进制数之间的转换
简便方法:835=512+256+64+2+1,故结果为 11 0100 0011 0.6875=0.5+0.125+0.0625,故结果为 0.1011 结果为 11 0100 0011.1011
十进制数与8进制数之间的转换
定点数和浮点数
计算机中只有0和1,数值数据中的小数点怎么表示呢? – 计算机中只能通过约定小数点的位置来表示 • 小数点位置约定在固定位置的数称为定点数 • 小数点位置约定为可浮动的数称为浮点数 • 定点小数用来表示浮点数的尾数部分 • 定点整数用来表示整数,分带符号整数和无符号整数 • 任何实数:X=(-1)s ×M×RE 其中,S取值为0或1,用来决定数X的符号;M是一个二进制定点小数,称为数X的尾数(mantissa);E是一个二进制定点整数,称为数X的阶或指数(exponent);R是基数(radix、base),
可以为2、4和16等。 计算机中只要表示S、M和E三个信息,就能确定X的值,这称为浮点数
定点数的编码表示
原码(Sign and Magnitude)表示
“正”号用0表示
“负”号用1表示
数值部分不变!
补码 - 模运算(modular运算)
重要概念:在一个模运算系统中,一个数与它除以“模”后的余数等价.
时钟是一种模12系统 现实世界中的模运算系统
假定钟表时针指向10点,要将它拨向6点, 则有两种拨法:
① 倒拨4格:10- 4 = 6
② 顺拨8格:10+8 = 18 ≡ 6 (mod 12)
模12系统中: 10- 4 ≡ 10+8 (mod 12) - 4 ≡ 8 (mod 12)
则,称8是- 4对模12的补码 (即:- 4的模12补码等于8)。
同样有 -3 ≡ 9 (mod 12) -5 ≡ 7 (mod 12)等
结论1: 一个负数的补码等于模减该负数的绝对值。
结论2: 对于某一确定的模,某数减去小于模的另一数,总可 以用该数加上另一数负数的补码来代替。
补码(modular运算):+ 和– 的统一 .
补码(2’s comlement)的表示
计算机中的运算器是模运算系统
结论:一个负数的补码等于将对应正数补码 各位取反、末位加一
变形补码(4’s comlement)的表示
求真值的补码
求补码的真值
移码表示Excess (biased) notion
C语言中的整数
C语言支持的基本数据类型
整数类型分:无符号整数和带符号整数
无符号整数 (Unsigned integer)
带符号整数(Signed integer)
C语言程序中的整数
无符号数:unsigned int ( short / long);带符号整数: int ( short / long)
常在一个数的后面加一个“u”或“U”表示无符号数
若同时有无符号和带符号整数,则C编译器将带符号整数强制转换为无符号数
假定以下关系表达式在32位用补码表示的机器上执行
例子:
例如,考虑以下C代码: 1 int x = –1; 2 unsigned u = 2147483648; 3 4 printf ( “x = %u = %d\n”, x, x); 5 printf ( “u = %u = %d\n”, u, u); 在32位机器上运行上述代码时,它的输出结果是什么?为什么? x = 4294967295 = –1 u = 2147483648 = –2147483648 因为–1的补码整数表示为“11…1”,作为32位无符号数解释 时,其值为2的32–1= 4 294 967 296–1 = 4 294 967 295。 231的无符号数表示为“100…0”,被解释为32位带符号整数 时,其值为最小负数:–2的32-1 = –231 = –2 147 483 648。
编译器处理常量时默认的类型
浮点数的编码表示
科学计数法(Scientific Notation)与浮点数
浮点数(Floating Point)
浮点数的表示
IEEE 754 标准
机器数转换为真值
真值转换为机器数
规格化数
0的机器数表示
+∞/-∞的机器数表示
“非数”的表示
非数值数据的编码表示
西文字符的编码表示
特点 –是一种拼音文字,用有限几个字母可拼写出所有单词 –只需对有限个字母和数学符号、标点符号等辅助字符编码 –所有字符总数不超过256个,使用7或8个二进位可表示 • 表示(常用编码为7位ASCII码) –十进制数字:0/1/2…/9 –英文字母:A/B/…/Z/a/b/…/z –专用符号:+/-/%/*/&/…… –控制字符(不可打印或显示) • 操作 –字符串操作,如:传送/比较 等
至少需2个字节才能表示一个汉字内码。为什么? –由汉字的总数(超过6万字)决定! • 可在GB2312国标码的基础上产生汉字内码 –为与ASCII码区别,将国标码的两个字节的第一位置“1”后 得到一种汉字内码(可以有不同的编码方案) 例:汉字“大”在码表中位于第20行、第83列。因此区位码为 0010100 1010011,在区、位码上各加32得到两个字节编码,即 00110100 01110011B=3473H。前面的34H和字符“4”的ACSII码相同,后面的73H和字符“s”的ACSII码相同,
但是,将每个字节的最高位各设为“1”后,就得到其内码:B4F3H (1011010011110011B),因而不会和ASCII码混淆。
数据宽度和存储容量的单位
- 比特(bit,位)是计算机中处理、存储、传输信息的最小单位
- 二进制信息最基本的计量单位是“字节”(Byte) –现代计算机中,存储器按字节编址
- 字节是最小可寻址单位 (addressable unit )
- 如果以字节为一个排列单位,则LSB表示最低有效字节,MSB 表示最高有效字节
- • 除比特(位)和字节外,还经常使用“字”(word) 作为单位
- “字”和 “字长”的概念不同 IA-32中的“字”有多少位? 字长多少位呢?
- DWORD :32位
- QWORD:64位
字和字节
- “字”和 “字长”的概念不同 –“字长”指数据通路的宽度。
- ”字长”等于CPU内部总线的宽度、运算器的位数、通用 寄存器的宽度(这些部件的宽度都是一样的)
- –“字”表示被处理信息的单位,用来度量数据类型的宽度
- –字和字长的宽度可以一样,也可不同
- 例1:对于x86体系结构,不管字长多少,定义“字”的宽 度都为16位,而从386开始字长就是32位了。
- 例2:对于MIPS 32体系结构,其字和字长都是32位。
数据量的度量单位
存储二进制信息时的度量单位要比字节或字大得多 容量经常使用的单位有: – “千字节”(KB),1KB=210字节=1024B – “兆字节”(MB),1MB=220字节=1024KB – “千兆字节”(GB),1GB=230字节=1024MB – “兆兆字节”(TB),1TB=240字节=1024GB • 通信中的带宽使用的单位有: – “千比特/秒”(kb/s),1kbps=103 b/s=1000 bps
– “兆比特/秒”(Mb/s),1Mbps=106 b/s =1000 kbps
– “千兆比特/秒”(Gb/s),1Gbps=109 b/s =1000 Mbps
– “兆兆比特/秒”(Tb/s),1Tbps=1012 b/s =1000 Gbps 如果把b换成B,则表示字节而不是比特(位) 例如,10MBps表示 10兆字节/秒
程序中数据类型的宽度
数据存储时的字节排列
数据的存储和排列顺序
大端/小端方式举例
以下是一个由反汇编器生成的一行针对IA-32处理器的机器 级代码表示文本: 80483d2: 89 85 a0 fe ff ff mov %eax, 0xfffffea0(%ebp) 其中,80483d2是十六进制表示的指令地址 89 85 a0 fe ff ff 是机器指令 mov %eax, 0xfffffea0(%ebp) 是对应的汇编指令 0xfffffea0是立即数 请问:立即数0xfffffea0的值和所存放地址分别是多少? IA-32是大端还是小端方式? 立即数0xfffffea0所存放的地址为0x80483d4; 立即数0xfffffea0的值为-10110000B=-176; IA-32采用的是小端方式!
错题集
正确答案:B你错选为A 解析: B、-8196=-(8192+4)=-10 0000 0000 0100B,因此,si和usi的机器数都为1101 1111 1111 1100,按无符号整数解释,其值为65535-3-8192=65535-8195=57340。
正确答案:D你错选为C 解析: D、-32768=-1000 0000 0000 0000B,因此,si和usi的机器数都为1000 0000 0000 0000,按无符号整数解释,其值为32768。
正确答案:D你错选为B 解析: D、65535=1111 1111 1111 1111B,因此,usi和si的机器数都为1111 1111 1111 1111,按带符号整数解释,其值为-1。
正确答案:C你错选为B 解析: A、2147483647的机器数为011┅1,在C90中为int型;2147483648的机器数为100┅0,在C90中为unsigned型,强制类型转换为int后,按带符号整数比较,显然011┅1比100┅0大,即结果为“假”。
B、2147483647的机器数为011┅1,在C90中为int型;2147483648的机器数为100┅0,在C90中为unsigned型,
-2147483648的机器数通过对100┅0各位取反末位加一得到,因此,机器数还是100┅0。011┅1和100┅0按无符号整数比较,显然011┅1比100┅0小,即结果为“假”。
C、-1的机器数为全1,-2的机器数为11┅10,按无符号整数比较,显然全1比任何数大,即结果为“真”。
D、-1的机器数为全1,按无符号整数比较,全1是最大的数,显然比0大,即结果为“假”。