34 73H(001101000111 0011B),前面的34H和字符“4”的 ASCI码相同,后面的73H和

第 3 版 · OCR 辅助 · 原书检索 · 文字用于定位,公式与图表请回原页核验 · 本次导入快照

### 34 73H(001101000111 0011B),前面的34H和字符“4”的 ASCI码相同,后面的73H和
字符“s”的ASCⅡ码相同,将每个字节的最高位各设为1后,就得到其机内码 B4 F3H
(10110100 1111 0011B)。这样就不会和 ASCI码混淆了。应当注意,汉字的区位码和国
标码是唯一的、标准的,而汉字内码可能随系统的不同而有差别。
汉字输入码与汉字内码完全是不同范畴的概念,不能把它们混淆起来。使用不同的输
入编码方法输入同一个汉字时,在计算机内部得到的汉字内码是一样的。
3. 汉字的字模点阵码和轮廓描述
经过计算机处理后的汉字,如果需要在屏幕上显示出来或用打印机打印出来,则必须把
汉字机内码转换成人们可以阅读的方块字形式。
每一个汉字的字形都必须预先存放在计算机内,一套汉字(例如GB 2312 国标汉字字
符集)的所有字符的形状描述信息集合在一起称为字形信息库,简称字库(font)。不同的字
体(如宋体、仿宋、楷体、黑体等)对应着不同的字库。在输出每一个汉字时,计算机都要先到
字库中去找到它的字形描述信息,然后把字形信息送到相应的设备输出。
汉字的字形主要有两种描述方法:字模点阵描述和轮廓描述。字模点阵描述是将字库
第2章
43


<!-- page: 61 -->

计算机组成与系统结构(第 3版)
44
中的各个汉字或其他字符的字形(即字模),用一个其元素由0和1组成的方阵(如16×16、
24×24、32×32甚至更大)来表示,汉字或字符中有黑点的地方用1表示,空白处用0表示,
把这种用来描述汉字字模的二进制点阵数据称为汉字的字模点阵码。汉字的轮廓描述方法
比较复杂,它把汉字笔画的轮廓用一组直线和曲线来勾画,记下每一直线和曲线的数学描述
公式。这种用轮廓线描述字形的方式精度高,字形大小可以任意变化。
2.5数据的宽度和存储
2.5.1数据的宽度和单位
二进制数据的每一位(0或1)是组成计算机中信息的最小单位,称为一个比特(bit),或
称位元,简称位。每个西文字符通常用8比特表示,而每个汉字用16比特表示。在计算机
内部,二进制信息的计量单位是字节(byte),也称位组。1字节等于8比特。
计算机中信息使用的单位除比特和字节外,还经常使用字(word)作为单位。不同的计
算机,字的长度和组成不完全相同,有的由2字节组成,有的由4、8甚至16字节组成。
在考察计算机性能时,一个很重要的性能参数就是机器的字长。平时所说的“16 位”或
是“32 位”机器中的16、32 就是指字长。所谓字长通常是指 CPU 内部用于整数运算的数据
通路的宽度。CPU 内部数据通路是指 CPU内部的数据流经的路径以及路径上的部件,主
要包括用于运算的 ALU 和用于存储中间结果的通用寄存器等,这些部件的宽度一致才能
相互匹配。因此,字长等于CPU内部用于整数运算的运算器位数和通用寄存器宽度。
字和字长的概念不同,这一点请注意。字用来表示被处理信息的单位,用来度量各种数
据类型的宽度。通常系统结构设计者必须考虑一台机器将提供哪些数据类型,每种数据类
型提供哪几种宽度的数,这时就要给出一个基本的字的宽度。例如,Intel x86微处理器中
把一个字定义为16位。所提供的数据类型中,就有单字宽度的无符号数和带符号整数(16
位)、双字宽度的无符号数和带符号整数(32位)等。而字长表示进行数据运算、存储和传送
的部件的宽度,它反映了计算机处理信息的一种能力。在绝大多数计算机中,字和字长的宽
度一样,但有些也可能不同。例如,在Intel微处理器中,从80386开始就至少都是32 位机
器了,即字长至少为32位,但其字的宽度都定义为16位,32 位称为双字。
表示二进制信息所用的单位要比字节或字大得多。通常通过在字母 B(字节)或b(位)
之前加上前缀来表示单位,如KB、MB、GB等,这里的K、M和G等有两种度量方式,一种
是日常使用的按10的幂次度量的方式;另一种是计算机系统中使用的按2的幂次度量的
方式。
1.主存容量使用的单位
在描述主存容量时,通常用以下按2的幂次进行度量的单位。
kilobyte
1KB=21°字节=1024字节
megabyte 1MB=2字节=1048 576 字节
gigabyte
1GB=2字节=1073 741 824字节
terabyte
1TB=2“字节=1 099 511 627 776 字节
petabyte
1PB=2字节=1125 899 906 842 624 字节


<!-- page: 62 -->

数据的机器级表示
1EB=2*字节=1152921504606 846 976字节
exabyte
zettabyte 1ZB=2字节=1 180 591 620 717 411 303 424字节
yottabyte 1YB=2"字节=1 208 925 819 614 629 174 706 176 字节
2.主频和带宽使用的单位
在描述主频、总线或网络带宽时,通常用10的幂次表示。例如,网络带宽经常使用的单
位如下。
比特/秒(b/s)
有时也写为bps
千比特/秒(kb/s) 1kb/s=103b/s=1000bps
兆比特/秒(Mb/s) 1Mb/s=10*b/s=1000kbps
吉比特/秒(Gb/s)
1Gb/s=10°b/s=1000Mbps
太比特/秒(Tb/s) 1Tb/s=101*b/s=1000Gbps
从上面的描述可以看出,1M可能是22,也可能是10°,具体的值是多少,要看上下文描
述的是主存容量还是主频或网络带宽来判断。其他的如G、T、P等字母的含义也同样要看
上下文。
3.硬盘和文件使用的单位
在计算硬盘容量或文件大小时,不同的硬盘制造商和操作系统用不同的度量方式,因而
比较混乱。例如,所有版本的Microsoft Windows操作系统都使用二进制前缀(2的幂次),
在其文件属性对话框中,显示 22°字节的文件为1MB或1024KB,显示10°字节的文件为
976KB。而在Mac OS X10.6之前版本的操作系统上都使用了十进制前缀(10的幂次),因
此报告10*字节的文件大小为1MB。
显然,这种表示方式会导致混乱。在历史上,甚至引发了一些硬盘买家的诉讼,他们原
本预计1M会是22°,1G会是2°,但实际容量却远比自己预计的小。为了避免歧义,国际电
工委员会(International Electrotechnical Commission,IEC)在1998年给出了表示2的幂次
的二进制前缀字母定义,如表2.6所示,就是在原来的前缀字母后跟字母i。
表 2.6 表示二进制信息大小的单位
十进制前缀
IEC 定义的二进制前缀
值差
单词
前缀
值
单词
前缀
值
(%)
kilobyte
KB
10
kibibyte
KiB
2!”
2%
megabyte
MB
10?
mebibyte
MiB
22
5%
gigabyte
GB
10°
gibibyte
GiB
240
7%
terabyte
TB
10
tebibyte
TiB
2?”
10%
petabyte
PB
101?
pebibyte
PiB
2i
13%
exabyte
EB
101
exbibyte
EiB
2m
15%
zettabyte
ZB
10
zebibyte
ZiB
2’°
18%
yottabyte
YB
102
yobibyte
YiB
2
21%
第2章
45
C语言支持多种格式的整数和浮点数表示。数据类型 char 表示单个字节,能用来表示


<!-- page: 63 -->

计算机组成与系统结构(第3版)
46
单个字符,也可用来表示8位整数。类型int 之前可加上long和short,以提供不同长度的
整数表示。表2.7给出了在典型的32位机器和64位的Compaq Alpha 机器上C语言中数
值数据类型的宽度。大多数32位机器使用“典型”方式。从表2.7可以看出,短整数为2字
节,普通int型整数为4字节,而长整数的长度与机器字长的宽度相同。指针(例如一个声
明为类型 char*的变量)和长整数的宽度一样,也等于机器字长的宽度。一般机器都支持
float 和 double两种类型的浮点数,分别对应IEEE 754单精度和双精度格式。
表2.7 C语言中数值数据类型的宽度
单位:字节
C 声明
典型的32 位机器
Compaq Alpha 机器
char
short int
int
long int
1
2
4
4
1
2
4
8
char*
4
8
float
double
4
8
4
8
由此可见,同一类型的数据并不是所有机器都采用相同的数据宽度,分配的字节数随机
器和编译器的不同而不同。
2.5.2数据的存储和排列顺序
任何信息在计算机中用二进制编码后,得到的都是一串0/1序列,每8位构成一个字
节,不同的数据类型具有不同的字节宽度。如果以字节为一个排列基本单位,那么LSB表
示最低有效字节(least significant byte),MSB表示最高有效字节(most significant byte)。
现代计算机基本上都采用字节编址方式,即对存储空间中的存储单元进行编号时,每个地址
编号中存放一个字节。计算机中许多类型数据由多个字节组成,例如,int 和 float 型变量占
用4字节,double型变量占用8字节等,程序中对每个变量给定一个最小的首地址作为变量
的地址,多个字节存放在连续的存储单元中。例如,在一个按字节编址的计算机中,假定int
型变量i的地址为0800H,i的机器数为01234567H,则01H、23H、45H、67H这4个字节应
该存放在地址为0800H~0803H这4个存储单元中。那么,0800H~0803H这4个存储单
元中各自存放哪个字节呢?这就是字节排列顺序问题。
根据各字节在连续存储单元中排列顺序的不同,有两种排列方式:大端(big endian)和
小端(little endian),如图2.3所示。
0800H
0801H
0802H
0803H
大端方式
01H
23H
45H
67H
0800H
0801H
0802H
0803H
小端方式
67H
45H
23H
0IH
图 2.3 大端方式和小端方式


<!-- page: 64 -->

数据的机器级表示
大端方式将数据的最高有效字节 MSB存放在低地址单元中,即数据的地址就是 MSB
所在的地址。IBM360/370、Motorola 68k、MIPS、Sparc、HP PA等机器都采用大端方式。
小端方式将数据的最低有效字节 LSB存放在低地址单元中,即数据的地址就是LSB
所在的地址。Intel 80x86、DEC VAX 等都采用小端方式。
有些微处理器,如 Alpha和 Motorola的 PowerPC,能够运行在任意一种模式中,只要
在加电启动时选择确定采用大端还是小端方式即可。每个计算机系统内部的数据排列顺序
都是一致的,但在系统之间进行通信时可能会发生问题。在排列顺序不同的系统之间进行
数据通信时,需要进行顺序转换。网络应用程序员必须遵守字节顺序的有关规则,以确保发
送方机器将它的内部表示格式转换为网络标准,而接收方机器则将网络标准转换为自己的
内部表示格式。
此外,像音频、视频和图像等文件格式或处理程序也都涉及字节顺序问题。如GIF、PC
Paintbrush,Microsoft RTF等采用小端方式,Adobe Photoshop、JPEG、MacPaint 等采用大
端方式。
例2.26 以下是一段C程序,其中函数show_int 和 show_float分别用于显示 int 型和
float型数据的值,show_pointer用于显示指向int型数据的指针的值。显示的结果都用十
六进制形式表示。
### 1 void test_show_bytes(int val)
### 2 (
3
int ival=val;
4
float fval=(float) ival;
5
int*pval=&ival;
6
show_int(ival);
7
show_float(fval);
8
show_pointer(pval);
### 9 )
上述程序在不同系统(Linux和NT运行于Intel Pentium Ⅱ)上运行的结果见表 2.8。
表 2.8 程序在不同系统中的运行结果
系 统
值
类型
字节(十六进制)
Linux
NT
Sun
Alpha
12345
12345
12345
12345
int
int
int
int
### 39 30 00 00
### 39 30 00 00
### 00 00 30 39
### 39 30 00 00
Linux
NT
Sun
Alpha
12345.0
12345.0
12345.0
12345.0
float
float
float
float
### 00 E4 40 46
### 00 E4 40 46
### 46 40 E4 00
### 00 E4 40 46
Linux
NT
Sun
Alpha
&.ival
&.ival
&.ival
&.ival
int*
int'
int*
int'
3C FA FF BF
1C FF 44 02
EF FF FC E4
### 80 FC FF 1F 01 00 00 00
第2章
47


<!-- page: 65 -->

计算机组成与系统结构(第3版)
48
请回答下列问题。
(1)十进制数12345用32位补码整数和32 位浮点数表示的结果各是什么?
(2)十进制数12345的整数表示和浮点数表示中存在一段相同位序列,标记出这段位
序列,并说明为什么会相同。对一个负数来说,其整数表示和浮点数表示中是否也一定会出
现一段相同的位序列?为什么?
(3)Intel Pentium Ⅱ采用的是小端方式还是大端方式?
(4)Sun 和 Alpha 之间能否直接进行数据传送?为什么?
(5)在 Alpha上,表中数据字节30H所存放的地址是什么?
解:(1)十进制数12345用32位补码整数表示为0000 0000 0000 0000 0011 0000 0011 1001,
用32位浮点数表示为0100 0110 0100 0000 1110 0100 0000 0000。用十六进制表示分别为
### 00 00 30 39H和46 40 E4 00H。
(2)十进制数12345的整数表示和浮点数表示中相同位序列为10000 0011 1001(见
(1)中粗体部分)。因为对正数来说,原码和补码的编码相同,所以其整数(补码表示)和浮点
数尾数(原码表示)的有效数位一样。12345的有效数位是110000 0011 1001。有效数位在
定点整数中位于低位数值部分,在浮点数的尾数中位于高位部分。因为尾数中有一个隐含
的1,所以第一个有效数位1在浮点数中不表示出来,因此,相同的位序列就是后面的13位。
因为 IEEE 754浮点数的尾数用原码表示,而整数用补码表示,负数的原码和补码表示
不同,所以,对某一个负数来说,其整数表示和浮点数表示中不一定会有相同的一段位序列。
(3)Linux和NT(运行在Intel PentiumⅡ)的存放方式与书写习惯顺序相反,故 Intel
Pentium Ⅱ采用的是小端方式。
(4)Sun和Alpha之间不能直接进行数据传送。因为它们采用了不同的存放方式,Sun
是大端方式,这里Alpha 设置的是小端方式。
(5)在Alpha上数据字节30H存放在地址000000011F FF FC 81H中。因为从
Alpha输出的int型指针结果来看,Alpha的主存地址占64位,30H是int型数据12345的
次低有效字节,小端方式下数据地址取 LSB的地址,所以30H存放的地址应该是数据地址
随后的那个地址。根据小端方式下存放结果和书写习惯顺序相反的规律,可知数据12345
的地址是00 0000011F FF FC 80H,所以,随后的地址就是00 00 00 01 1F FF FC 81H。
2.6本 章 小 结
程序被转换为机器代码后,数据总是由指令来处理,对指令来说数据就是一串0/1序
列。根据指令的类型,对应的0/1序列可能是一个无符号整数,或是带符号整数,或是浮点
数,或是一个位串(即非数值数据,如逻辑值或 ASCⅡ码或汉字内码等)。无符号数是正整
数,用来表示地址等;带符号整数用补码表示;浮点数表示实数,大多用IEEE 754标准
表示。
数据的宽度通常以字节(byte)为基本单位表示,数据长度单位(如 MB、GB、TB等)在
表示容量和带宽等不同对象时所代表的大小不同。数据的排列有大端和小端两种排列方
式。大端方式以MSB所在地址为变量的地址,即给定的变量地址处存放的是数据最高有
效字节;小端方式以LSB所在地址为变量的地址,即给定地址处存放的是最低有效字节。


<!-- page: 66 -->

数据的机器级表示
习题
1.给出以下概念的解释说明。
真值
机器数
数值数据
定点数
原码
反码
尾数
阶码
移码
规格化数左规
右规
逻辑数
ASCII码
汉字输入码
小端方式 最高有效字节最低有效字节
非数值数据
补码
溢出
非规格化数
汉字内码
无符号整数
变形补码
下溢
机器零
机器字长
带符号整数
浮点数
上溢
非数(NaN)
大端方式
2.简单回答下列问题。
(1)为什么计算机内部采用二进制表示信息?既然计算机内部所有信息都用二进制表示,为什么还要
学习十六进制表示?
(2)常用的定点数编码方式有哪几种?通常它们各自用来表示什么信息?
(3)为什么现代计算机中大多用补码表示带符号整数?
(4)在浮点数的基数和总位数一定的情况下,浮点数的表示范围和精度分别由什么决定?两者如何相
互制约?
(5)为什么要对浮点数进行规格化?有哪两种规格化操作?
(6)为什么计算机处理汉字时会涉及不同的编码(如输入码、内码、字模码)?说明这些编码中哪些用
二进制编码,哪些不用二进制编码。为什么?
3.实现下列各数的转换。
(1)(25.8125)?n=(?)z=(?)s=(?)is
(2)(101101.011)2=(?)?n=(?)a=(?)ig
(3)(4E.C)is=(?)1n=(?)?
4.假定机器数为8位(1位符号,7位数值),写出下列各二进制小数的原码表示。
+0.1001,-0.1001,+1.0,-1.0,+0.010100,-0.010100,+0.0,-0.0
5.假定机器数为8位(1位符号,7位数值),写出下列各二进制整数的补码和移码(偏置常数为128)
表示。
+1001,-1001,+1,-1,+10100,-10100,+0,-0
6.已知[x]w,求x。
(1)[x]=1,1100111
(2)[x]+=10000000
(3)[x]*=0.1010010
(4)[x]*=11010011
7.假定一台32位字长的机器中带符号整数用补码表示,浮点数用IEEE754标准表示,寄存器 R1和
R2的内容分别为R1:0000108BH,R2;8080108BH。不同指令对寄存器内容进行不同的操作,因而,不
同指令执行时寄存器内容对应的真值不同。假定执行下列运算指令时,操作数为寄存器R1和R2的内容,
则 R1和 R2 中操作数的真值分别为多少?
(1)无符号整数加法指令。
(2)带符号整数乘法指令。
(3)单精度浮点数减法指令。
8.假定机器 M的字长为32位,用补码表示带符号整数。下表第一列给出了在机器M上执行的C语
言程序中的关系表达式,请参照已有的表栏内容完成表中后三栏内容的填写。
第2章
49


<!-- page: 67 -->

计算机组成与系统结构(第3版)
关系表达式
运算类型
结果
说明
50
0==0U
-1<0
-1<0U
2147483647>-2147483647-1
2147483647U>-2147483647-1
2147483647>(int)2147483648U
-1>-2
(unsigned)-1>-2
无符号整数
带符号整数
0
1
11⋯1B(22-)>00⋯0B(O)
011⋯1B(23-1)>100⋯0B(-21)
注:表中第4和第5行的一2147483647-1没有写成-2147483648,因为编译器处理一个形如-x的表达式时,通常
会先读取表达式x,然后对x取负。当x=2147483648时,因为用32位补码无法表示x,所以,写成-2147483648时可能
会发生意想不到的结果,
9.以下是一个C语言程序,用来计算一个数组a中每个元素的和。当参数len为0时,返回值应该是
0,但是在机器上执行时,却发生了存储器访问异常。请问这是什么原因造成的,并说明程序应该如何
修改。
### 1 float sum_elements(float a[],unsigned len)
### 2 {
3
inti;
4
float result=0;
5
6
for(i-0; i<-len-1:i++)
7
result+=a[i];
89
return result;
10}
10.设某浮点数格式为
数符
阶码
尾数
1位
5位移码
6位补码数值部分
其中,移码的偏置常数为16,补码采用一位符号位,基数为4。
(1)用这种格式表示下列十进制数:+1.75,+19,-1/8。
(2)写出该格式浮点数的表示范围,并与12位定点补码整数和定点补码小数表示范围比较。
11.下列几种情况所能表示的数的范围是什么?
(1)16 位无符号整数。
(2)16 位原码定点小数。
(3)16 位补码定点小数。
(4)16 位补码定点整数。
(5)下述格式的浮点数(基数为2,移码的偏置常数为128):
数符
阶码
尾数
1位
8位移码
7位原码数值部分
12.以 IEEE 754单精度浮点数格式表示下列十进制数。
+1.75,+19,-1/8,258
13.设一个变量的值为4098,要求分别用32位补码整数和IEEE754单精度浮点格式表示该变量(结
果用十六进制表示),并说明哪段二进制序列在两种表示中完全相同,为什么会相同?


<!-- page: 68 -->

数据的机器级表示
14.设一个变量的值为一2147483647,要求分别用32位补码整数和IEEE754单精度浮点格式表示
该变量(结果用十六进制表示),并说明哪种表示其值完全精确,哪种表示的是近似值。
15.下表给出了有关IEEE754浮点格式表示中一些重要的非负数的取值,表中已经有最大规格化数
的相应内容,要求填入其他浮点数格式的相应内容。
项目
阶 码
尾数
单 精 度
双 精 度
以 2的幂次
表示的值
以10的幂次
表示的值
以2的幂次
表示的值
以10的幂次
表示的值
0
1
最大规格化数
最小规格化数
最大非规格化数
最小非规格化数
+%
NaN
11111110
1⋯11
(2—2-23)×2127
3.4×1038
(2—2-52)×21023
1.8×10
16.已知下列字符编码:A=100 0001,a=110 0001,0=0110000,求E、e、f、7、G、Z、5的7位ASCⅡ码
和第一位前加入奇校验位后的8位编码。
17.假定在一个程序中定义了变量x、y和i,其中,x和y是float 型变量(用IEEE754单精度浮点数
表示),i是16位short型变量(用补码表示)。程序执行到某一时刻,x=-0.125、y=7.5、i=100,它们都
被写到了主存(按字节编址),其地址分别是100、108和112。请分别画出在大端机器和小端机器上变量
x、y和i在内存的存放位置。
第2章
51


<!-- page: 69 -->

第
章
3
运算方法和运算部件
计算机完成的功能通过执行程序来实现,任何程序最终都要转换为机器指令。指令中
包含的各种算术逻辑运算能直接在硬件上执行,执行这些运算的硬件称为运算部件。
本章首先分析高级语言和机器指令中涉及的各类运算,然后介绍这些运算用到的核心
部件——算术逻辑单元(ALU)的组成与工作原理,在此基础上,对这些运算在计算机内部
的实现算法和过程进行详细说明,最后介绍实现这些运算的运算部件。
3.1高级语言和机器指令中的运算
计算机硬件的设计目标来源于软件需求,高级语言中用到的各种运算,通过编译成底层
的算术运算指令和逻辑运算指令实现,这些底层运算指令能在机器硬件上直接被执行。因
此,在介绍运算部件的设计之前,有必要先了解一下高级语言程序和机器指令所涉及的一些
运算。所有高级语言的运算功能大同小异,一种语言能代表高级语言的总体情况,因此,本
书以C语言中的运算为例进行说明。同样,指令中涉及的运算也可用某个特定的指令系统
来说明,本书主要介绍MIPS指令系统中的运算。
3.1.1C语言程序中涉及的运算
加、减、乘、除等算术运算是高级语言中必须提供的基本运算。C语言中除算术运算外,
还有以下几类基本运算:按位、逻辑、移位、位扩展和位截断等运算。
1.按位运算
C语言中的按位运算包括按位或运算(1)、按位与运算(&.)、按位取反运算(~)、按位异
或运算(^)等。按位运算的一个重要运用就是实现掩码(masking)操作,通过与给定的一个
位模式进行按位与,可以提取所需要的位,然后可以对这些位进行“置1”“清0”“1测试”或
“0 测试”等。这里位模式被称为掩码。例如,表达式0x0F&0x8C的运算结果为00001100,
即 0x0C。这里通过掩码0x0F提取了0x8C的低4位。
2.逻辑运算
C语言中的逻辑运算包括或运算(Ⅱ)、与运算(8.&)、非运算(!)。这些逻辑运算很容
易和按位运算混淆,事实上它们的功能完全不同。逻辑运算是非数值计算,其操作数只有两
个逻辑值:True和 False。通常用非0表示 True,全0表示 False。


<!-- page: 70 -->

运算方法和运算部件
3.移位运算
C 语言中提供了一组移位运算,有逻辑移位和算术移位两种。
逻辑移位不考虑符号位,总是把高(低)位移出,低(高)位补0。对于无符号整数应采用
逻辑移位,逻辑左移时,若最高位移出的是1,则发生溢出。
因为带符号整数都用补码表示,所以其移位操作应采用算术移位方式。左移时,高位移
出,低位补0,如果移出的高位不同于移位后的符号位,即左移前、后符号位不同,则发生溢
出;右移时,低位移出,高位补符号。
虽然C语言没有明确规定应该采用逻辑移位还是算术移位。但是,实际上许多机器和
编译器都对无符号整数采用逻辑移位方式,而对带符号整数采用算术移位方式。表达式
x<<k表示对数x左移k位。事实上,对于左移来说,逻辑移位和算术移位的结果都一样,
都是丢弃k个最高位,并在低位补k个0。表达式x>>k表示对数x右移k位。
每左移一位,相当于数值扩大一倍,所以左移可能会发生溢出,左移k位,相当于数值
乘以2*;每右移一位,相当于数值缩小一半,右移k位,相当于数值除以2*。
4.位扩展和位截断运算
C语言中没有明确的位扩展运算符,但是在进行数据类型转换时,如果遇到一个短数向
长数转换,就要进行位扩展运算了。进行位扩展时,扩展后的数值应保持不变。有两种位扩
展方式:0扩展和符号扩展。0扩展用于无符号数,只要在短的无符号数前面添加足够的0
即可。符号扩展用于补码表示的带符号整数。通过在短的带符号整数前添加足够多的符号
位来扩展。
考虑以下C语言程序代码: