类型转换
需了解整形和浮点型之间的类型转换,以及不同长度的类型之间的转换,可能在选择题考察,也会在大题中作为知识点考察。
有符号整数和无符号整数
这里需要了解有符号整数(int)和无符号整数(unsigned)这两个类型:
int
:使用补码来存储数据。unsigned
:所有位,包括最高位,都用于表示数值,表示非负数。
以8位有符号整数和无符号整数说明一下
- 8 位有符号整数
- 表示的范围为
-128 ~ 127
- 最大数为
127
,对应的二进制为0111 1111
- 最小数为
-128
,对应的二进制为1000 0000
- 表示的范围为
- 8 位无符号整数
- 表示的范围为
0 ~ 255
- 最大数为
255
,对应的二进制为1111 1111
- 最小数为
0
,对应的二进制为0000 0000
- 表示的范围为
当int
和unsigned
进行类型转化时,位模式不变,可以理解成计算机存储单元中的二进制表示没有变化,只是从程序层面阐述该二进制数据的方式变了。
当我们将8位的有符号整数-128
转化为无符号整数时,其值变成了128
。
整形和浮点数
- 从
float
到int
: 将浮点数转换为整数时,小数部分会被舍去。例如,将 3.9 转换为整数将得到 3。 - 从
int
到float
: 将整数转换为浮点数时,结果会是一个等值的浮点数。例如,将整数 4 转换为浮点数将得到 4.0。
不同长度的类型转换
类型 | 最小位数 | 常见位数(32位系统) | 常见位数(64位系统) |
---|---|---|---|
signed char | 8位 | 8位 | 8位 |
short | 16位 | 16位 | 16位 |
int | 16位 | 32位 | 32位 |
long | 32位 | 32位 | 64位 |
long long | 64位 | 64位 | 64位 |
- 较小的整数类型被转换为较大的整数类型时,高位会被自动填充为0
- 较大的整数类型被转换为较小的整数类型时,高位会被自动截断
以short
和int
的类型转化为例说明:
/* 将short转为int */
short s = 0x1234;
int i = s;
// 高16位被填充为0
// i = 0x00001234
/* 将int转为short */
int i = 0x12345678;
short s = i;
// 高16位被截断
// s = 0x5678
隐式和显式类型转换
- 隐式类型转换
你在一个表达式中混合使用 int
和 float
时,C语言会自动进行类型转换以使得表达式可以正确计算。通常情况下,低精度类型会被提升到高精度类型,即 int
会被转换为 float
。
- 显式类型转换
也可以使用类型转换运算符显式地转换一个类型为另一个类型。
/* 隐式类型转换 */
int i = 5;
float f = 2.5;
float result = i + f; // i 被隐式转换为5.0然后进行计算
/* 显式类型转换 */
int i = 5;
float f = 3.2;
int result = (int)f + i; // f 被显式转换为3,然后与i相加