Presentation is loading. Please wait.

Presentation is loading. Please wait.

第二章 数据的机器级表示与处理 数值数据的表示 非数值数据的表示 数据的存储 数据的运算

Similar presentations


Presentation on theme: "第二章 数据的机器级表示与处理 数值数据的表示 非数值数据的表示 数据的存储 数据的运算"— Presentation transcript:

1 第二章 数据的机器级表示与处理 数值数据的表示 非数值数据的表示 数据的存储 数据的运算
第二章 数据的机器级表示与处理 数值数据的表示 非数值数据的表示 数据的存储 数据的运算

2 数据的表示和运算 主要教学目标 掌握计算机内部各种数据的编码表示及其运算方法 了解高级语言程序中的各种类型变量对应的表示形式
在高级语言程序中的变量、机器数和底层硬件(寄存器、加法器、ALU等)之间建立关联 综合运用所学知识,分析高级语言和机器级语言程序设计中遇到的各种与数据表示和运算相关的问题,解释相应的执行结果 存在问题 学生缺乏将机器级数据表示和程序设计及程序调试工作相互关联的意识。许多学生也许对机器级数据表示的基本原理和概念很了解,但在程序设计和调试工作中,往往不会运用所学知识解决实际问题,不会把高级语言中的类型定义、数值范围、数据类型转换等问题和本课程所学的知识联系起来,因而,所学知识没有起到真正的作用。 解决方法 为了增强学生对机器级数据表示的认识,可以让学生亲自编写相关的程序,通过程序的执行结果来理解本章所学的知识。 例如:确定float型变量和double型变量的精度;检查一些特殊表达式的运行结果,如一个非零整数除以0、一个非零实数除以0、0除以0、负数开平方等等;(3) 编程检查机器是大端还是小端方式,数据是对齐存放还是不对齐存放。 C语言参考网站:

3 数据的表示和运算 围绕C语言中的运算,解释其在底层机器级的实现 分以下三个部分介绍 第一讲:数值数据的表示
定点数的编码表示、整数的表示、无符号整数、带符号整数、浮点数的表示 C语言程序的整数类型和浮点数类型 第二讲:非数值数据的表示、数据的存储 逻辑值、西文字符、汉字字符 数据宽度单位、大端/小端、对齐存放 第三讲:数据的运算 按位运算\逻辑运算\移位运算 位扩展和位截断运算 无符号和带符号整数的加减运算 无符号和带符号整数的乘除运算 变量与常数之间的乘除运算 浮点数的加减乘除运算 围绕C语言中的运算,解释其在底层机器级的实现 从C程序的表达式出发,用机器数在电路中的执行来解释表达式的执行结果

4 课程内容概要 /*---sum.c---*/ int sum(int a[ ], unsigned len) {
int i,sum = 0; for (i = 0; i <= len–1; i++) sum += a[i]; return sum; } 数据的表示 数据的运算 如果程序处理的是图像、视频、声音、文字等数据,那么, (1)如何获得这些数据? (2)如何表示这些数据? (3)如何处理这些数据? /*---main.c---*/ int main() { int a[1]={100}; int sum; sum=sum(a,0); printf(“%d”,sum); }

5 “转换”的概念在数据表示中的反映 感觉媒体信息 问题(应用) 抽象概括 树、链表等结构化数据描述 算法 程序定义的int、float等数据
指令中的寄存器或内存中数据 ALU或总线上的运算/传输数据 逻辑门 位信息 问题(应用) 抽象概括 算法 具体实现 程序(语言) 指令集体系结构(ISA) 微结构 电路 器件(晶体管)

6 你知道数码相机拍摄一张照片的过程吗? 离散化、编码 各类数据之间的转换关系

7 数值数据的表示 数值数据表示的三要素 定/浮点表示(解决小数点问题) 答案是:不知道! 定点数的编码(解决正负号问题) 进位计数制
定、浮点表示 如何用二进制编码 即:要确定一个数值数据的值必须先确定这三个要素。 例如,机器数 的值是多少? 十进制、二进制、十六进制、八进制数及其相互转换 定/浮点表示(解决小数点问题) 定点整数、定点小数 浮点数(可用一个定点小数和一个定点整数来表示) 定点数的编码(解决正负号问题) 原码、补码、反码、移码 (反码很少用) 答案是:不知道!

8 Sign and Magnitude (原码的表示)
Binary Decimal 01 2 3 4 5 6 7 0000 0001 0010 0011 0100 0101 0110 0111 Decimal Binary -0 -1 -2 -3 -4 -5 -6 -7 1000 1001 1010 1011 1100 1101 1110 1111 容易理解, 但是: 0 的表示不唯一,故不利于程序员编程 加、减运算方式不统一 需额外对符号位进行处理,故不利于硬件设计 特别当 a<b时,实现 a-b比较困难 Sign and magnitude is convenient for human, but not convenient for computer. Since 1950’s, all computers use 2’s complement representation. Complement: Need different ways to do addition and subtraction. We’ll see soon that 2’s complement need not to distinguish between addition and subtraction. 从 50年代开始,整数都采用补码来表示 但浮点数的尾数用原码定点小数表示

9 补码 - 模运算(modular运算) 时钟是一种模12系统 假定钟表时针指向10点,要将它拨向6点, 则有两种拨法:
重要概念:在一个模运算系统中,一个数与它除以“模”后的余数等价。 时钟是一种模12系统 假定钟表时针指向10点,要将它拨向6点, 则有两种拨法: ① 倒拨4格:10- 4 = 6 ② 顺拨8格:10+8 = 18 ≡ (mod 12) 模12系统中: ≡ (mod 12) - 4 ≡ (mod 12) 则,称8是- 4对模12的补码 (即:- 4的模12补码等于8)。 同样有 -3 ≡ (mod 12) -5 ≡ (mod 12)等 现实世界中的模运算系统 Supplement slide: More about 2’s complement. 结论1: 一个负数的补码等于模减该负数的绝对值。 结论2: 对于某一确定的模,某数减去小于模的另一数,总可以用该数加上另一数负数的补码来代替。 补码(modular运算):+ 和– 的统一

10 补码的表示 例1:“钟表”模运算系统 假定时针只能顺拨,从10点倒拨4格后是几点?
现实世界的模运算系统举例 例1:“钟表”模运算系统 假定时针只能顺拨,从10点倒拨4格后是几点? 10- 4 = 10+(12- 4) = 10+8 = 6 (mod 12) 例2:“4位十进制数” 模运算系统 假定算盘只有四档,且只能做加法,则在算盘上计算 等于多少? =9828+( ) = = =7900(mod 104) 取模即只留余数,高位“1”被丢弃!相当于只有低4位留在算盘上。

11 计算机中的运算器是模运算系统 8位二进制加法器模运算系统 结论1: 一个负数的补码等于对应正数补码的“各位取反、末位加一”
计算 = ? = ( ) = = (mod 28) = 只留余数,“1”被丢弃 结论1: 一个负数的补码等于对应正数补码的“各位取反、末位加一”

12 运算器适合用补码表示和运算 运算器只有有限位,假设为n位,则运算结果只能保留低n位,故可看成是个只有n档的二进制算盘,因此,其模为2n 。
0000 0001 1000 0010 0100 1110 1111 0111 0101 1010 1011 1100 1101 0011 0110 1001 当n=4时,共有16个机器数:0000 ~ 1111,可看成是模为24 的钟表系统。真值的范围为 -8 ~ +7 补码的定义 假定补码有n位,则: [X]补= 2n + X (-2n≤X< 2n ,mod 2n) X是真值,[x]补是机器数 真值和机器数的含义是什么?

13 求特殊数的补码 假定机器数有n位 ① [-2n-1]补= 2n - 2n-1 = 10…0(n-1个0) (mod 2n)
32位机器中,int、short、char型数据的机器数各占几位?

14 补码与真值之间的简便转换 例: 设机器数有8位,求123和-123的补码表示。 如何快速得到123的二进制表示?
解: 123 = 127 – 4 = B – 100B = B – 123= – B [ ]补= = = (mod 28),即 7BH。 [– ]补= 28 – = – = – = = ,即 85H。 各位取反,末位加1 当机器数为16位时,结果怎样?

15 Unsigned integer(无符号整数)
机器中字的位排列顺序有两种方式:(例:32位字: 0…010112) 高到低位从左到右: 高到低位从右到左: Leftmost和rightmost这两个词有歧义,故用LSB(Least Significant Bit)来表示最低有效位,用MSB来表示最高有效位 高位到低位多采用从左往右排列 一般在全部是正数运算且不出现负值结果的场合下,可使用无符号数表示。例如,地址运算,编号表示,等等 无符号整数的编码中没有符号位 能表示的最大值大于位数相同的带符号整数的最大值(Why?) 例如,8位无符号整数最大是255( ) 而8位带符号整数最大为127( ) 总是整数,所以很多时候就简称为“无符号数” LSB MSB

16 Signed integer(带符号整数,定点整数)
计算机必须能处理正数(positive) 和负数(negative),MSB表示数符 有三种定点编码方式 Signed magnitude (原码) 现用来表示浮点(实)数的尾数 One’s complement (反码) 现已不用于表示数值数据 Two’s complement (补码) 50年代以来,所有计算机都用补码来表示定点整数 为什么用补码表示带符号整数? 补码运算系统是模运算系统,加、减运算统一 数0的表示唯一,方便使用 比原码和反码多表示一个最小负数

17 C语言程序中的整数 无符号数:unsigned int ( short / long);带符号整数: int ( short / long)
常在一个数的后面加一个“u”或“U”表示无符号数 若同时有无符号和带符号整数,则C编译器将带符号整数强制转换为无符号数 假定以下关系表达式在32位用补码表示的机器上执行,结果是什么? 关系表达式 运算类型 结果 说明 0 == 0U -1 < 0 -1 < 0U > U > > (int) U -1 > -2 (unsigned) -1 > -2

18 C语言程序中的整数 带*的结果与常规预想的相反! 关系 表达式 类 型 结 果 说明 0 = = 0U -1 < 0
> U > > (int) U -1 > -2 (unsigned) -1 > -2 1 0* 1* 00…0B = 00…0B 11…1B (-1) < 00…0B (0) 11…1B (232-1) > 00…0B(0) 011…1B (231-1) > 100…0B (-231) 011…1B (231-1) < 100…0B(231) 011…1B (231-1) > 100…0B (-231) 11…1B (-1) > 11…10B (-2) 11…1B (232-1) > 11…10B (232-2) 带*的结果与常规预想的相反!

19 C语言程序中的整数 例如,考虑以下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 = = –1 u = = – 因为–1的补码整数表示为“11…1”,作为32位无符号数解释时,其值为232–1= –1 = 。 231的无符号数表示为“100…0”,被解释为32位带符号整数时,其值为最小负数:–232-1 = –231 = – 。

20 C语言程序中的整数 小班讨论 1)在有些32位系统上,C表达式 < 的执行结果为false。Why? 2)若定义变量“int i= ;”,则“i < ”的执行结果为true。Why? 3)如果将表达式写成“ < ”,则结果会怎样呢?Why? 1)在ISO C90标准下 , 为unsigned int型,因此 “ < ”按无符号数比较, 10……0B比01……1大,结果为false。 在ISO C99标准下 , 为long long型,因此 “ < ”按带符号整数比较, 10……0B比01……1小,结果为true。 2)i < 按int型数比较,结果为true。 3) < 按int型比较,结果为true。 由C语言中的“Integer Promotion”规则决定的。

21 科学计数法(Scientific Notation)与浮点数
Example: mantissa (尾数) exponent(阶码、指数) x decimal point radix (base,基) ° Normalized form(规格化形式): 小数点前只有一位非0数 ° 同一个数有多种表示形式。例:对于数 1/1,000,000,000 • Normalized (唯一的规格化形式): 1.0 x 10-9 • Unnormalized(非规格化形式不唯一): 0.1 x 10-8, 10.0 x 10-10 Before we move on to the floating-point representation, let’s review the familiar scientific notation. For example, we can use 6.02x1021 to represent 6,020,000,000,000,000,000,000. Here, the part before x is called mantissa, the base is 10, the power of ten is called exponent. What the exponent mean? Who knows that? Exponent is used for deciding the position of decimal point. When we change exponent,the decimal point can be floated. In this example, If we change the exponent to 31, it means the number of digits of real value will be 31+1=32,the number become longer and it’s value is more larger, but we need not increase the number of digits in exponent. It’s still 2 digits. In the scientific notation, a mantissa with no leading 0s and only one digit to left of decimal point is called to be normalized. It means an normalized number should have a nonzero leftmost digit. So, there is only one normalized form, whereas there are many unnormalized forms. For example, if we want to represent 1/1,000,000,000, the normalized form is 1.0x10-9 , whereas 0.1x10-8 and 10.0x10-10n are not normalized number. In this example, the exponent is negative (-9), it means the actual decimal point should be to the left of the 9th place. With this scientific notation, We only need to describe mantissa and exponent. Every normalized mantissa is a fixed-point number because there is only one nonzero digit in the integer part. Every exponent is a integer which decides the place of decimal point, so they are short and can be also represented in fixed-point numbers. So we can use two short fixed-point numbers to represent a very long number. for Binary Numbers: mantissa(尾数) exponent(指数) 0.101two x binary point 基为2 只要对尾数和指数分别编码,就可表示一个浮点数(即:实数)

22 浮点数(Floating Point)的表示范围
例:画出下述32位浮点数格式的规格化数的表示范围。 第0位数符S;第1~8位为8位移码表示阶码E(偏置常数为128);第9~31位为24位二进制原码小数表示的尾数M。规格化尾数的小数点后第一位总是1,故规定第一位默认的“1”不明显表示出来。这样可用23个数位表示24位尾数。 +/-0.1xxxxx × 2E S 阶码E 尾数M 最大正数:0.11…1 x 211…1 =(1-2-24) x 2127 最小正数:0.10…0 x 200…0 =(1/2) x 2-128 因为原码是对称的,所以其表示范围关于原点对称。 正下溢 负下溢 - (1 2 4 ) × 127 数轴 可表示的正数 可表示的负数 129 正上溢 负上溢 机器0:尾数为0 或 落在下溢区中的数 浮点数范围比定点数大,但数的个数没变多,故数之间更稀疏,且不均匀

23 浮点数的表示 +/-1.xxxxxxxxxx × RExponent °32-bit 规格化数: 31 0
°Normal format(规格化数形式) : +/-1.xxxxxxxxxx × RExponent °32-bit 规格化数: S Exponent Significand 1 bit ? bits ? bits S 是符号位(Sign) Exponent用移码(增码)来表示 Significand 表示 xxxxxxxxxxxxx,尾数部分 (基可以是 2/ 4 / 8 / 16,约定信息,无需显式表示 ) °早期的计算机,各自定义自己的浮点数格式 we can use the following format to represent any expressible binary number.Here,for normalized format, the leading digit before binary point is always 1. we can also assume that the base is always 2. So we only need to store sign, x’s and exponent in computers. Therefore, a floating point number has three fields, that is S for storing sign, ……, Here xxxxx is called significand. The base can be 2/ 4/ 8/ 16 , which is implicit and need not to be stored since it is the same for all numbers. Until about 1980, each manufacturer had its own floating-point format. They are all different. How many bits were used for exponent, how many for significand, and which of 2/ 4/ 8/ 16 was used for base, all of these were decided by manufactures. It led to many problems.We can not exchange floating-point data among different computers. Sometimes we may get different results for the same calculation. It is necessary to have one standard of FP representation. This is IEEE 754 Standard. Any question before move on to IEEE 754 Standard? 问题:浮点数表示不统一会带来什么问题?

24 “Father” of the IEEE 754 standard
直到80年代初,各个机器内部的浮点数表示格式还没有统一 因而相互不兼容,机器之间传送数据时,带来麻烦 1970年代后期, IEEE成立委员会着手制定浮点数标准 1985年完成浮点数标准IEEE 754的制定 Prof. William Kahan ieee754status/754story.html This standard was primarily the work of one person, UC Berkeley math professor William Kahan. 现在所有计算机都采用IEEE 754来表示浮点数 In the late 1970s, IEEE set up a committee to standardize floating-point arithmetic. The goal was not only to permit floating-point data to be exchanged among different computers but also to provide hardware designers with a model known to be correct. The resulting work led to IEEE Standard 754 which was finished in Nowadays, most computers use IEEE 754 standard to represent floating-point numbers. This standard was primarily the work of one person, UC Berkeley math professor William Kahan. People call him the father of the IEEE 754 standard. Because of his contribution to the standard, he won ACM Turing Award in This is the highest prize in computation field, It’s equivalent to Nobel Prize.

25 IEEE 754标准 °Exponent(阶码 / 指数): °Significand(尾数): Single Precision :
规定:小数点前总是“1”,故可隐含表示。注意:和前面例子规定不一样,这里更合理! 规格化数:+/-1.xxxxxxxxxxtwo x 2Exponent Single Precision : S Exponent Significand 1 bit bits bits ° Sign bit: 1 表示negative ; 0表示 positive °Exponent(阶码 / 指数): SP规格化数阶码范围为 (-126) ~ (127) bias为127 (single), 1023 (double) 全0和全1用来表示特殊值! 为什么用127?若用128,则阶码范围为多少? °Significand(尾数): • 规格化尾数最高位总是1,所以隐含表示,省1位 • bits ( single), bits (double) IEEE 754 standard defines three formats: Single precision(32 bits), double precision (64 bits) and extended precision (80 bits). (The extended-precision format is intended to reduce round off errors. It is used primarily inside floating-point arithmetic units.) All of them start with a sign bit for the number as a whole, 1 means negative, 0 means positive. Next is the exponent, using bias (or excess) of 127 for single precision, 1023 for double precision. The minimum 0 and maximum exponent (255 and 2047) are not used for normalized numbers, because they have special uses. It means the exponents of normalized numbers range from 1 to 254 for single precision. Finally, we have significand field. Because normalized numbers always have a leading 1 before binary point, so we needn’t store this bit. In order to pack more bits, the standard use one implicit bit of leading 1 for normalized numbers. So for single precision, the mantissa of an normalized number has bits. To summarize the above information, we can get the formula for single precision number. From this formula, we can see that : if s is 1, the number will be negative, if s is 0, the number will be positive. This 1 is the implicit leading 1, and then plus significand, will be the mantissa. Because we store the biased exponent which add 127 to the real value in this bit pattern, it means that the real value of the exponent should be subtract 127 from biased exponent. For normalized double precision numbers, the formula is similar except for …. Any question for this? If we know the bit pattern of an normalized floating-point number, we can calculate the value of this number using the formula. (-127) ~ (126) SP: (-1)S x (1 + Significand) x 2(Exponent-127) DP: (-1)S x (1 + Significand) x 2(Exponent-1023)

26 Ex: Converting Binary FP to Decimal
BEE00000H is the hex. Rep. Of an IEEE 754 SP FP number (-1)S x (1 + Significand) x 2(Exponent-127) °Sign: 1 => negative °Exponent: • two = 125ten • Bias adjustment: = -2 If we know the hexadecimal representation of an IEEE 754 single precision number, how to calculate the actual value of this number? Here is an example. Suppose the hex form is BEE00000H. At first, we should convert the hex form to binary form, we get the binary form …0000, and for single precision, we have 1 sign bit, which is 1, 8 bits for exponent, which is , and the remainder is 23-bit significand. Then we can use the formula to calculate the value. Step 1: sign bit is 1, it means the number is negative Step 2: exponent is = = =125, because we use excess 127, so we should subtract 127 to get the actual value of exponent =-2 Step 3: here actual mantissa is , so the value should be 1+…., …. The result is 1.75 Step 4: So the actual value is Any question about that? °Significand: 1 + 1x2-1+ 1x x x x = = = 1.75 °Represents: -1.75tenx2-2 =

27 Ex: Converting Decimal to FP
-12.75 1. Denormalize: 2. Convert integer part: 12 = = 11002 3. Convert fractional part: .75 = = .112 4. Put parts together and normalize: = x 23 If we know the value of an number, how to represent it in floating-point form? Here is an exercise. Please spend 4 minutes to try it. Let’s check your answers. Firstly, then, and then, finally, the result is C14C0000H. Have you got that? Any question? 5. Convert exponent: = = The Hex rep. is C14C0000H

28 Normalized numbers(规格化数)
小班讨论 前面的定义都是针对规格化数(normalized form) How about other patterns? Exponent Significand Object anything Norms implicit leading 1 ? nonzero ? ? nonzero ?

29 Representation for 0 How to represent 0? exponent: all zeros
significand: all zeros What about sign? Both cases valid. +0: -0: 小班讨论 If exponent and significand bits are all zeros, it means the value is 0. It could be positive 0 or negative 0. They are equal.

30 Representation for +∞/-∞
小班讨论 In FP, 除数为0的结果是 +/- ∞, 不是溢出异常.(整数除0为异常) ∞ :infinity 为什么要这样处理? • 可以利用+∞/-∞作比较。 例如:X/0>Y可作为有效比较 How to represent +∞/-∞? • Exponent : all ones ( B = 255) • Significand: all zeros +∞ : -∞ : Do you know the infinity symbol ∞? Who can tell me the meaning of this symbol? As we know, if x!=0, when y tend to 0, then x/y tend to ∞. So IEEE 754 suggested x/0 (any finite number divided by 0)should produce infinity, not overflow. Because we can do further computations with infinity, For example, if a program have comparison X/0 > Y, it won’t produce overflow, it can be a valid comparison. If exponent bits are all ones and significand bits are all zeros, the value is infinity. It could be positive infinity or negative infinity. They are not equal. There are some operations with infinity. Any finite number add infinity will be infinity. Operations 5.0 / 0 = +∞, / 0 = -∞ 5+(+∞) = +∞, (+∞)+(+∞) = +∞ 5 - (+∞) = -∞, (-∞) - (+∞) = -∞ etc

31 Representation for“Not a Number”
Sqrt (- 4.0) = ? /0 = ? Called Not a Number (NaN) - “非数” How to represent NaN Exponent = 255 Significand: nonzero NaNs can help with debugging 小班讨论 Operations sqrt (-4.0) = NaN /0 = NaN op (NaN,x) = NaN ∞+(-∞) = NaN +∞- (+∞) = NaN ∞/∞ = NaN etc. Who can tell me what is the result of the square root of –4.0 ? Yes, the result is undefined. 0 divided by 0, infinity divided by infinity are all the same. If infinity is not an error, these should not be either. We call them Not a Number. We read it NaN. In this situation, the exponent bits will be all ones, the significand will be nonzero bit pattern. We can use NaN to help with debugging. If the calculating result is NaN, we can set some test point to see what happened. There are some operations which may produce NaN. We can define any finite number operate with NaN will produce NaN. Infinity minus infinity will produce NaN, and so on.

32 Representation for Denorms(非规格化数)
小班讨论 What have we defined so far? (for SP) Used to represent Denormalized numbers Exponent Significand Object /-0 nonzero Denorms anything Norms implicit leading 1 /- infinity nonzero NaN We have defined normalized number, we briefly call them norms, we also have defined 0, infinity and NaN, we have know that: …….. we have used all combination except for this one, we can use this combination to represent denormalized numbers.

33 Representation for Denorms
小班讨论 1.0…0x2-126~ 1.1…1x2-126 GAP 2-125 2-126 2-124 2-123 Normalized numbers 0.0…0x2-126~ 0.1…1x2-126 As we know, in IEEE standard, normalized numbers are those with the form: +/- 1.aa…a x 2bb…b, where aa…a can be anything(from 00…0 to 11…1), bb…b can be from 00…01 ( the value is 1-127=-126) to 11…10 (the value is =127). Considering positive number, the smallest number is 1.00…0 x Between 0 and the smallest number there is a big gap. IEEE use the combination of exponent=00…0 and significand=nonzero to fill in this gap. These number are called denormalized numbers. We briefly call them denorms. In denorm form, the exponent is always 00…0, and no implicit leading 1, the significand is nonzero bit pattern. It means denormalized numbers have form of +/- 0.aa…a x , here aa…a can be 0.00…01, 0.000…10, ……., 0.11…1. Any questions about that? There are a lot of things you should think about here. Like 1….,2…..3….. 2-126 2-125 2-124 2-123 Denorms (-1)s×0.xx…x ×2-126

34 关于浮点数精度的一个例子 小班讨论 和 是两个可表示数,两者之间相差 。当输入数据是一个不可表示数时,机器将其转换为最邻近的可表示数。 小班讨论

35 第一讲小结 在机器内部编码后的数称为机器数,其值称为真值 定义数值数据有三个要素:进制、定点/浮点、编码 整数的表示
无符号数:正整数,用来表示地址等;带符号整数:用补码表示 C语言中的整数 无符号数:unsigned int ( short / long);带符号数: int ( short / long) 浮点数的表示 符号;尾数:定点小数;指数(阶):定点整数(基不用表示) 浮点数的范围 正上溢、正下溢、负上溢、负下溢;与阶码的位数和基的大小有关 浮点数的精度:与尾数的位数和是否规格化有关 浮点数的表示(IEEE 754标准):单精度SP(float)和双精度DP(double) 规格化数(SP):阶码1~254,尾数最高位隐含为1 “零” (阶为全0,尾为全0) ∞ (阶为全1,尾为全0) NaN (阶为全1,尾为非0) 非规格化数 (阶为全0,尾为非0,隐藏位为0) 十进制数的表示:用ASCII码或BCD码表示

36 数据的表示和运算 分以下三个部分介绍 第一讲:数值数据的表示 定点数的编码表示 整数的表示 无符号整数、带符号整数 浮点数的表示
C语言程序的整数类型和浮点数类型 第二讲:非数值数据的表示、数据的存储 逻辑值、西文字符、汉字字符 数据宽度单位 大端/小端、对齐存放

37 逻辑数据的编码表示 表示 运算 识别 位串 用一位表示 。例如,真:1 / 假:0 N位二进制数可表示N个逻辑数据,或一个位串 按位进行
用一位表示 。例如,真:1 / 假:0 N位二进制数可表示N个逻辑数据,或一个位串 运算 按位进行 如:按位与 / 按位或 / 逻辑左移 / 逻辑右移 等 识别 逻辑数据和数值数据在形式上并无差别,也是一串0/1序列,机器靠指令来识别。 位串 用来表示若干个状态位或控制位(OS中使用较多) 例如,x86的标志寄存器含义如下: CF PF AF ZF SF TF IF DF OF

38 西文字符的编码表示 特点 表示(常用编码为7位ASCII码) 操作 是一种拼音文字,用有限几个字母可拼写出所有单词
只对有限个字母和数学符号、标点符号等辅助字符编码 所有字符总数不超过256个,使用7或8个二进位可表示 表示(常用编码为7位ASCII码) 十进制数字:0/1/2…/9 英文字母:A/B/…/Z/a/b/…/z 专用符号:+/-/%/*/&/…… 控制字符(不可打印或显示) 操作 字符串操作,如:传送/比较 等 必须熟悉对应的ASCII码!

39 汉字及国际字符的编码表示 特点 编码形式 问题:西文字符有没有输入码?有没有内码?有没有字模点阵或轮廓描述?
汉字是表意文字,一个字就是一个方块图形。 汉字数量巨大,总数超过6万字,给汉字在计算机内部的表示、汉字的传输与交换、汉字的输入和输出等带来了一系列问题。 编码形式 有以下几种汉字代码: 输入码:对汉字用相应按键进行编码表示,用于输入 内码:用于在系统中进行存储、查找、传送等处理 字模点阵或轮廓描述: 描述汉字字模点阵或轮廓,用于显示/打印 问题:西文字符有没有输入码?有没有内码?有没有字模点阵或轮廓描述?

40 汉字内码 至少需2个字节才能表示一个汉字内码。为什么? 可在GB2312国标码的基础上产生汉字内码 由汉字的总数决定!
为与ASCII码区别,将国标码的两个字节的第一位置“1”后得到一种汉字内码 例如,汉字“大”在码表中位于第20行、第83列。因此区位码为 ,国标码为 ,即3473H。前面的34H和字符“4”的ACSII码相同,后面的73H和字符“s”的ACSII码相同,将每个字节的最高位各设为“1”后,就得到其内码:B4F3H ( B),因而不会和ASCII码混淆。

41 汉字的字模点阵码和轮廓描述 为便于打印、显示汉字,汉字字形必须预先存在机内 字库 (font):所有汉字形状的描述信息集合
不同字体 (如宋体、仿宋、楷体、黑体等) 对应不同字库 从字库中找到字形描述信息,然后送设备输出 问题:如何知道到哪里找相应的字形信息? 汉字内码与其在字库中的位置有关!! 字形主要有两种描述方法: 字模点阵描述(图像方式) 轮廓描述(图形方式) 直线向量轮廓 曲线轮廓(True Type字形)

42 数据的基本宽度 比特(bit)是计算机中处理、存储、传输信息的最小单位 二进制信息的计量单位是“字节”(Byte),也称“位组”
现代计算机中,存储器按字节编址 字节是最小可寻址单位 (addressable unit ) 如果以字节为一个排列单位,则LSB表示最低有效字节,MSB表示最高有效字节 除比特和字节外,还经常使用“字”(word)作为单位 “字”和 “字长”的概念不同 IA-32中的“字”有多少位?字长多少位呢? DWORD :32位 QWORD:64位 16位 32位

43 数据的基本宽度 “字”和 “字长”的概念不同 “字长”指数据通路的宽度。
(数据通路指CPU内部数据流经的路径以及路径上的部件,主要是CPU内部进行数据运算、存储和传送的部件,这些部件的宽度基本上要一致,才能相互匹配。因此,”字长”等于CPU内部总线的宽度、运算器的位数、通用寄存器的宽度等。 ) “字”表示被处理信息的单位,用来度量数据类型的宽度。 字和字长的宽度可以一样,也可不同。 例如,x86体系结构定义“字”的宽度为16位,但从386开始字长就是32位了。

44 数据量的度量单位 存储二进制信息时的度量单位要比字节或字大得多 容量经常使用的单位有: 通信中的带宽使用的单位有:
“千字节”(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兆字节/秒

45 程序中数据类型的宽度 高级语言支持多种类型、多种长度的数据 必须确定相应的机器级数据表示方式和相应的处理指令
小班讨论 高级语言支持多种类型、多种长度的数据 例如,C语言中char类型的宽度为1个字节,可表示一个字符(非数值数据),也可表示一个8位的整数(数值数据) 不同机器上表示的同一种类型的数据可能宽度不同 必须确定相应的机器级数据表示方式和相应的处理指令 C语言中数值数据类型的宽度 (单位:字节) C声明 典型32位 机器 Compaq Alpha char short int int long int 1 2 4 8 char* float double 从表中看出:同类型数据并不是所有机器都采用相同的宽度,分配的字节数随机器字长和编译器的不同而不同。 Compaq Alpha是一个针对高端应用的64位机器,即字长为64位

46 数据的存储和排列顺序 80年代开始,几乎所有机器都用字节编址 ISA设计时要考虑的两个问题: 小班讨论
如何根据一个字节地址取到一个32位的字?- 字的存放问题 一个字能否存放在任何字节边界?- 字的边界对齐问题 65535=216-1 [-65535]补=FFFF0001H 例如,若 int i = ,存放在内存100号单元(即占100#~103#),则用“取数”指令访问100号单元取出 i 时,必须清楚 i 的4个字节是如何存放的。 msb lsb little endian word 100# big endian word 100# Word: FF FF 大端方式(Big Endian): MSB所在的地址是数的地址 e.g. IBM 360/370, Motorola 68k, MIPS, Sparc, HP PA 小端方式( Little Endian): LSB所在的地址是数的地址 e.g. Intel 80x86, DEC VAX 有些机器两种方式都支持,可通过特定控制位来设定采用哪种方式。

47 BIG Endian versus Little Endian
小班讨论 Ex3: Memory layout of a instruction located in 1000 假定小端机器中指令:mov AX, 0x12345(BX) 其中操作码mov为40H,寄存器AX和BX的编号分别为0001B和0010B,立即数占32位,则存放顺序为: 00 01 23 45 12 40 45 23 01 00 12 40 1005 1004 1003 1002 1001 1000 地址 40 1 2 若在大端机器上,则存放顺序如何? 40 1 2 只需要考虑指令中立即数的顺序!

48 Byte Swap Problem(字节交换问题)
小班讨论 78 3 12 3 56 2 34 2 34 1 increasing byte address 56 1 12 78 Big Endian Little Endian 上述存放在0号单元的数据(字)是什么? H? H? 存放方式不同的机器间程序移植或数据通信时,会发生什么问题? 每个系统内部是一致的,但在系统间通信时可能会发生问题! 因为顺序不同,需要进行顺序转换 音、视频和图像等文件格式或处理程序都涉及到字节顺序问题 ex. Little endian: GIF, PC Paintbrush, Microsoft RTF,etc Big endian: Adobe Photoshop, JPEG, MacPaint, etc

49 Alignment(对齐) Alignment: 要求数据的地址是相应的边界地址 目前机器字长一般为32位或64位,而存储器地址按字节编址
小班讨论 Alignment: 要求数据的地址是相应的边界地址 目前机器字长一般为32位或64位,而存储器地址按字节编址 指令系统支持对字节、半字、字及双字的运算,也有位处理指令 各种不同长度的数据存放时,有两种处理方式: 按边界对齐 (假定存储字的宽度为32位,按字节编址) 字地址:4的倍数(低两位为0) 半字地址:2的倍数(低位为0) 字节地址:任意 不按边界对齐 坏处:可能会增加访存次数! (学了存储器组织后会更明白!) 每4个字节可同时读写

50 Alignment(对齐) 按边界对齐 边界不对齐 小班讨论 如:int i, short k, double x, char c, short j,…… 存储器按字节编址 每次只能读写某个字地址开始的4个单元中连续的1个、2个、3个或4个字节 0 字节 1字节 2字节 3字节 x:2个周期 j:1个周期 则:&i=0; &k=4; &x=8; &c=16; &j=18;…… 字节0 字节 字节2 字节3 虽节省了空间,但增加了访存次数! 需要权衡,目前来看,浪费一点存储空间没有关系! x:3个周期 j:2个周期 则: &i=0; &k=4; &x=6; &c=14; &j=15;……

51 Alignment(对齐) 举例 struct S2 { 例如,考虑下列两个结构声明: int i; struct S1 { int j;
char c; }; 小班讨论 例如,考虑下列两个结构声明: struct S1 { int i; char c; int j; }; S2比S1好 在要求对齐的情况下,哪种结构声明更好? S1: i c X X X j 4 8 需要12个字节 S2: i c j 4 8 只需要9个字节 对于“struct S2 d[4]”,只分配9个字节能否满足对齐要求? 不能! S2: i c X X X j 4 8 也需要12个字节

52 第二讲小结 非数值数据的表示 逻辑数据用来表示真/假或N位位串,按位运算 西文字符:用ASCII码表示
汉字:汉字输入码、汉字内码、汉字字模码 数据的宽度 位、字节、字(不一定等于字长) k /K / M / G / T / P / E / Z / Y 有不同的含义 数据的存储排列 数据的地址:连续若干单元中最小的地址,即:从小地址开始存放数据 问题:若一个short型数据si存放在单元0x 和0x 中,那么si的地址是什么? 大端方式:用MSB存放的地址表示数据的地址 小端方式:用LSB存放的地址表示数据的地址 按边界对齐可减少访存次数


Download ppt "第二章 数据的机器级表示与处理 数值数据的表示 非数值数据的表示 数据的存储 数据的运算"

Similar presentations


Ads by Google