数据的表示和存储

时间:2024-02-24 14:10:41

数制与编码

“转换”的概念在数据表示中的反映

信息的二进制编码

  • 机器级数据分两大类
    •   数值数据:无符号整数、带符号整数、浮点数(实数)
    •   非数值数据:逻辑数(包括位串)、西文字符和汉字
  • 计算机内部所有信息都用二进制(即: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的补码整数表示为“111”,作为32位无符号数解释
时,其值为2的32–1= 4 294 967 2961 = 4 294 967 295。
 231的无符号数表示为“1000”,被解释为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┅0011┅1和100┅0按无符号整数比较,显然011┅1比100┅0小,即结果为“假”。
C、-1的机器数为全1,-2的机器数为11┅10,按无符号整数比较,显然全1比任何数大,即结果为“真”。
D、-1的机器数为全1,按无符号整数比较,全1是最大的数,显然比0大,即结果为“假”。