观历年统考真题,不难发现 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),它们互相转换的规则如下:
进制转换 | 转换规则 | 进制转换 | 转换规则 |
---|---|---|---|
二进制->十进制 | 按权累加 | 十进制->二进制 | 整数位除留取余,小数位乘积取整 |
二进制->八或十六进制 | 凑位转换 | 八或十六进制->二进制 | 按位重写 |
十进制->八或十六进制 | 先转二进制 | 八或十六进制->十进制 | 按权累加 |
八进制->十六进制 | 先转二进制 | 十六进制->八进制 | 先转二进制 |
(二)编码表示
无符号整数省略了一位符号位,所以在字长相同的情况下,它能表示的最大数比有符号整数能表示的大。一般在全部是正数运算且不出现负值结果的场合下,使用无符号整数表示。
有符号整数可以采用不同的编码方式,包括原码、反码、补码、移码四种,它们的特点如下:
编码方式 | 特点 | 表示范围(字长n+1位) |
---|---|---|
原码 | 最高位表示数的符号,其余各位表示数的绝对值 | -(2n-1)~2n-1 |
反码 | 正数的反码和原码相同,负数的反码等于各位取反 | 同原码 |
补码 | 正数的补码和原码相同,负数的补码等于各位取反+1 | -2n~2n-1 |
移码 | 在真值上加上一个偏置值 | —— |
(三)类型转换
C 语言允许在不同的数据类型之间做类型转换,转换规则基于两种数据类型的长度,具体规则如下:
方式 | 规则 |
---|---|
长度相同 | 直接改变解释方式 |
短变长 | 先扩展(有符号整数符号扩展、无符号整数零扩展)再解释 |
长变短 | 先截短(留低位)再解释 |
(四)运算部件
1.加减法
加减法的运算部件是加法器,是ALU最主要的部分:
无符号整数相当于正整数的补码表示,因此图中的电路同时也能实现无符号数的加/减运算,对于有符号数x和y,图中X和Y分别是x和y的补码表示;对于无符号数x和y,图中X和Y分别是x和y的二进制表示。不论是补码减法还是无符号数减法,都是用被减数加上减数的负数的补码来实现的。
1)加法器标志
常考带标志加法器,务必牢记各个标志的含义以及表达式:
标志 | 适用 | 含义 | 表达式 |
---|---|---|---|
ZF(zero) | 无、带符号整数 | 零标志 | |
SF(sign) | 带符号整数 | 符号标志 | |
OF(overflow) | 带符号整数 | 溢出标志 | |
CF(carry) | 无符号整数 | 进位标志 |
2)移位运算
移位分为逻辑移位和算术移位,逻辑移位不考虑符号,算术移位考虑符号:
移位方式 | 规则 |
---|---|
逻辑移位 | 左移时,高位移出,低位补 0;右移时,低位移出,高位补0。 |
算术移位 | 左移时,高位移出,低位补 0,若移出的高位不同于移位后的符号位,即左移前后的符号位不同,则发生溢出;右移时,低位移出,高位补符号位,若低位的1移出,则影响精度。 |
3)溢出判断
符号位数 | 判断方法 |
---|---|
一位符号位 | |
两位符号位 |
2.乘除法
乘除法仅需掌握运算思想即可。
1)乘法逻辑电路
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的整数倍,这样无论所取的数据是字节、半字还是字,均可一次访存取出。当所存数据不满足上述要求时,可通过填充空白字节使其符合要求。
写在后面
这个专栏主要是我在学习408真题的过程中总结的一些笔记,因为我学的也很一般,如果有错误和不足之处,还望大家在评论区指出。希望能给大家的学习带来一点帮助,共同进步!!!
参考资料
[1]王道408教材(2025版)
[2]王道课程资料