观历年统考真题,不难发现 unsigned、short、int、long、float、double等在C语言中的表示、运算、溢出判断、隐式类型转换、强制类型转换、IEEE754浮点数的表示,以及浮点数的运算,都是考研考查的重点,不仅在选择中考频较高,在大题中也经常考,因此需要牢固掌握。
总结来看,无非是对两种数据类型的操作:定点数和浮点数,其中定点数包含定点整数和定点小数,定点整数又可表示为无符号整数和有符号整数,本文我们着重讨论定点整数和浮点数。
其中定点整数包括:char(1B)、(unsigned)short(2B)、(unsigned)int(4B)、(unsigned)long(4/8B)、(unsigned)longlong(8B),浮点数包括float(4B)、double(8B)。
文章目录
一、定点整数
(一)数制转换
常用的数制主要有四种:十进制(D)、二进制(B)、八进制(O)、十六进制(H),进制的英文表示如下:
进制 | 英文表示 |
---|---|
二进制 | B,Binary |
八进制 | O,Octal |
十进制 | D,Decimal |
十六进制 | H,Hex |
它们互相转换的规则如下:
进制转换 | 转换规则 | 进制转换 | 转换规则 |
---|---|---|---|
二进制->十进制 | 按权累加 | 十进制->二进制 | 整数位除留取余,小数位乘积取整 |
二进制->八或十六进制 | 凑位转换 | 八或十六进制->二进制 | 按位重写 |
十进制->八或十六进制 | 先转二进制 | 八或十六进制->十进制 | 按权累加 |
八进制->十六进制 | 先转二进制 | 十六进制->八进制 | 先转二进制 |
(二)编码表示
无符号整数省略了一位符号位,所以在字长相同的情况下,它能表示的最大数比有符号整数能表示的大。一般在全部是正数运算且不出现负值结果的场合下,使用无符号整数表示。
有符号整数可以采用不同的编码方式,包括原码、反码、补码、移码四种,它们的特点如下:
编码方式 | 特点 | 表示范围(字长n+1位) |
---|---|---|
原码 | 最高位表示数的符号,其余各位表示数的绝对值 | -(2n-1)~2n-1 |
反码 | 正数的反码和原码相同,负数的反码等于各位取反 | 同原码 |
补码 | 正数的补码和原码相同,负数的补码等于各位取反+1 | -2n~2n-1 |
移码 | 在真值上加上一个偏置值 | —— |
(三)类型转换
不同数据类型在不同机器上的大小(常用32位机器):
数据类型 | 16位机器 | 32位机器 | 64位机器 |
---|---|---|---|
char | 1B | 1B | 1B |
short | 2B | 2B | 2B |
int | 2B | 4B | 4B |
long | 4B | 4B | 8B |
longlong | 8B | 8B | 8B |
float | 2B | 4B | 4B |
double | 8B | 8B | 8B |
C 语言允许在不同的数据类型之间做类型转换,转换规则基于两种数据类型的长度,除float、double外的具体转换规则如下:
方式 | 规则 |
---|---|
长度相同 | 直接改变解释方式 |
短变长 | 先扩展(有符号整数符号扩展、无符号整数零扩展)再解释 |
长变短 | 先截短(留低位)再解释 |
若将float、double转换为int,小数位部分会被舍去;int是精确到32位的整数,而float只保存到1+23位,因此一个32位的int整数在转换为float时可能会有损失,转换为double不会损失。
(四)运算部件
1.加减法
加减法的运算部件是加法器,是ALU最主要的部分:
无符号整数相当于正整数的补码表示,因此图中的电路同时也能实现无符号数的加/减运算,对于有符号数x和y,图中X和Y分别是x和y的补码表示;对于无符号数x和y,图中X和Y分别是x和y的二进制表示。不论是补码减法还是无符号数减法,都是用被减数加上减数的负数的补码来实现的。
注意以下几点:
- 无论是从原码变成补码还是从补码变成原码,都是符号位不变、数值部分取反加一;
- 从y补变成(-y)补,遵循符号位取反、数值位取反加一,这个规则适用于x补-y补转化为x补+(-y)补;
- int型负数x在被当作无符号数时,其值为232-|x|。
1)加法器标志
假设:某字长为8位的计算机中,带符号整数采用补码表示,数据存放在寄存器A和B中(可用A7—A0表示寄存器A的最高位到最低位),计算结果存储在C中(可用C7—C0表示寄存器A的最高位到最低位),加法器最高位进位用Fout表示。
常考带标志加法器,务必牢记各个标志的含义以及表达式:
标志 | 适用 | 含义 | 表达式 |
---|---|---|---|
OF(overflow) | 带符号整数 | 溢出标志 | ![]() |
SF(sign) | 带符号整数 | 符号标志 | ![]() |
ZF(zero) | 无、带符号整数 | 零标志 | ![]() |
CF(carry) | 无符号整数 | 进位标志 | ![]() |
关于OF的计算,详见下图:
注意,ALU生成标志位时只负责计算,不管运算对象是有符号数还是无符号数,那么OF表示将运算数当作有符号数时是否溢出,CF表示在将运算数当作无符号数时是否发生进位/借位。
条件转移指令的判断可借助标志位:
2)移位运算
移位分为逻辑移位和算术移位,逻辑移位不考虑符号,算术移位考虑符号:
移位方式 | 规则 |
---|---|
逻辑移位 | 左移时,高位移出,低位补 0;右移时,低位移出,高位补0。 |
算术移位 | 左移时,高位移出,低位补 0,若移出的高位不同于移位后的符号位,即左移前后的符号位不同,则发生溢出;右移时,低位移出,高位补符号位,若低位的1移出,则影响精度。 |
3)溢出判断
符号位数 | 判断方法 |
---|---|
一位符号位 | ![]() |
两位符号位 | ![]() |
2.乘除法
乘除法仅需掌握运算思想即可。
1)乘法逻辑电路
需要注意乘法溢出的判断(n位乘法):
- 带符号整数乘法运算溢出判断,高n+1位是否全1/全0
- 无符号整数乘法运算溢出判断,高n位是否均为0
2)除法逻辑电路
二、浮点数
(一)IEEE 754标准
浮点数最常考的就是IEEE 754 标准,因此要谨记其格式:
单精度格式中包含1位符号s、8位阶码e和23位尾数f,双精度格式包含1位符号s、11位阶码e和52位尾数f,基数隐含为2,尾数用原码表示。
注意以下几点:
1)单精度和双精度浮点数的偏置值分别为127和1023,在存储浮点数阶码之前,偏置值要先加到阶码真值上,且阶码全1代表无穷,全0代表0;
2)尾数的最高位总是1,为了能使尾数多表示一位有效位,将这个1隐藏,称为隐藏位,因此23位尾数实际表示了24位有效数字。
因此在该标准下,规格化单精度浮点数的真值为:
(-1)s x 1.f x 2e-127
规格化双精度浮点数的真值为:
(-1)s x 1.f x 2e-1023
int、float、double三种数据类型的表示范围如下:
类型 | 表示范围 |
---|---|
int | -231~(231-1) |
float | (+/-)[2-126~(2-2-23)*2127] |
double | (+/-)[(2-1022~(2-2-52)*21023] |
若将float、double转换为int,小数位部分会被舍去;int是精确到32位的整数,而float只保存到1+23位,因此一个32位的int整数在转换为float时可能会有损失,转换为double不会损失。
(二)数据存储
1.大端小端存储
数据存储方式有大端存储和小端存储两种:
1)大端方式:先存储高位字节,后存储低位字节。字中的字节顺序和原序列的相同。
2)小端方式:先存储低位字节,后存储高位字节。字中的字节顺序和原序列的相反。
2.边界对齐存储
现代计算机都是按字节编址的,假设字长为32 位,数据按边界对齐方式存放要求其存储地址是自身大小的整数倍,半字地址一定是2的整数倍,字地址一定是4的整数倍,这样无论所取的数据是字节、半字还是字,均可一次访存取出。当所存数据不满足上述要求时,可通过填充空白字节使其符合要求。
(三)运算术语
浮点数运算中的一些术语:
对阶:小阶变大阶。浮点数加/减运算时,在尾数相加/减之前所进行的操作称为对阶。对阶时,需要比较两个阶的大小,阶小的那个数的尾数右移,阶码增量。右移一次,阶码加1,直到两数的阶码相等为止。
左规:在浮点数运算中,当一个尾数的数值部分的高位出现0时,尾数为非规格化形式。此时,进行“左规”操作:尾数左移一位,阶码减1,直到尾数为规格化形式为止。
右规:在浮点数运算中,当尾数最高有效位有进位时,发生尾数溢出。此时,进行“右规”操作:尾数右移一位,阶码加1,直到尾数为规格化形式为止。右规过程中,要判断是否发生溢出。此时,只要阶码不发生上溢,则浮点数不会溢出。
舍入:舍入是指数值数据右部的低位数据需要丢弃时,为保证丢弃后数值误差尽量小而考虑的一种操作。有两种舍入方式,一种是0舍1入法,一种是恒置1法。0舍1入法,尾数右移时,若被移去的最高位数值为0,则舍去;若被移去的最高位数值为1,则在末位加1,由于这样可能导致尾数溢出,因此可能还需要再右归。在定点整数“右移”时、浮点加/减运算中某数“对阶”时、浮点运算结果“右规”时都会涉及到舍入。
溢出:溢出是指一个数比给定的格式所能表示的最大值还要大 (上溢),或比最小值还要小 (下溢) 的现象。因为无符号数、有符号定点数和有符号浮点数的位数是有限的,所以,都有可能发生溢出,但判断溢出的具体方法不同。
上溢:在浮点数运算中,当一个浮点数的指数超过了最大允许值,此时,浮点数发生上溢(即:向∞方向溢出)。如果结果是正数,则发生正上溢(有的机器把值置为+∞);如果是负数,则发生负上溢(有的机器把值置为-∞)。这种情况为软件故障,通常要引入溢出故障处理程序来处理。
下溢:在浮点数运算中,当一个浮点数的指数比最小允许值还小,此时,浮点数发生下溢。一般机器把下溢时的值置为0。此时,不发生溢出故障。
写在后面
这个专栏主要是我在学习408真题的过程中总结的一些笔记,因为我学的也很一般,如果有错误和不足之处,还望大家在评论区指出。希望能给大家的学习带来一点帮助,共同进步!!!
参考资料
[1]王道408教材(2025版)
[2]王道课程资料