前言
在写了这么久的习题博客,我发现其中非常爱考查的一个知识就是类型的转换,比如不同类型之间的加减乘除、比较大小和赋值运算等,这里面涉及最为多的就是隐式类型转换,所以在此专门写一个关于类型转换的知识点总结,也希望大家多多支持,一起努力!
一、类型转换
关于类型转换,只需要记住:两种类型有关联,才可以进行类型转换。并且我们没必要区分隐式类型转换和强制类型转换,其转换原则都是一样的,不同点在于隐式类型转换是自动完成的,而强制类型转换是需要我们介入后才可以完成。
这里需要注意的是,类型转换中会产生临时变量,临时变量都是右值,无法访问其地址空间
二. 关联的类型
关联类型 | 例子 | 类型转换的类型 |
整型之间 | char、int、short、long、long long unsigned系列 | 隐式类型转换 |
整型、浮点型 | 整型、double、float | 隐式类型转换 |
bool、整型 | true为1,false为0 0为false、非0为true | 隐式类型转换 |
bool、指针 | true为0x1、false为0x0 / NULL NULL为false、非NULL为true | 隐式类型转换 |
指针、整型 | 强制类型转换 | |
指针、指针 | 强制类型转换 | |
数组、指针 | 数组名转换为首元素指针 | 隐式类型转换 |
1. 整型之间
(1)赋值运算符:像左侧表达式类型转换
① 【低字节 = 高字节】高字节发生整型截断
② 【高字节 = 低字节】低字节发生整型提升
③ 【无符号 = 有符号】有符号转换为无符号,转换后注意最高位为数值位④ 【有符号 = 无符号】无符号转换为有符号,转换后注意最高位为符号位
(2)算数运算符(+、 -、 *、 /、 >、 <、 ==、 !=)
有符号转换为无符号、低字节转换为高字节
(3)函数传参、函数返回值
传参时:按照行参类型转换
返回值:按照函数返回值类型转换
转换规则与赋值一致
2. 整型与浮点型
(1)赋值运算符:像左侧表达式类型转换
① 【整型 = 浮点型】浮点型舍去小数部分
② 【浮点型 = 整型】整型加小数部分
(2)算数运算符(+、 -、 *、 /、 >、 <、 ==、 !=)
整型转换为浮点型
(3)函数传参、函数返回值
传参时:按照行参类型转换
返回值:按照函数返回值类型转换
转换规则与赋值一致
3. bool与整型
(1)赋值运算符:像左侧表达式类型转换
① 【bool = 整型】非0为true、0为false
② 【整型= bool】true为1、false为0
(2)函数传参、函数返回值
传参时:按照行参类型转换
返回值:按照函数返回值类型转换
转换规则与赋值一致
(3)条件判断
整型转换为bool
4. bool与指针
(1)赋值运算符:像左侧表达式类型转换
① 【bool = 指针】非NULL为true、NULL为false
② 【指针= bool】true为0x1、false为0x0
(2)函数传参、函数返回值
传参时:按照行参类型转换
返回值:按照函数返回值类型转换
转换规则与赋值一致
(3)条件判断
指针 转换为 bool
5. 指针与整型
因为指针是表示的地址,地址为十六进制数,而整型为十进制数,所以两者之间的转换,无非就是十进制数与十六进制数的变换,但是也需要注意字节大小,因为在32位机器上指针为4字节、在64位机器上指针为8字节。而int 为 4字节,可能会发生高字节向低字节转换,这种转换是会丢失一部分地址大小。
#include <stdio.h>
int main()
{
//在VScode测出的指针大小为8字节
printf("指针大小: %d\n", sizeof(void*));
int a = 1;
int* p = &a;
int b = (int)p;
printf("p = %p\n", p);
printf("b = %x\n", b);
return 0;
}
通过结果来看,确实丢失了一部分地址,这需要注意!
解决办法: 注意隐式类型转换和printf的格式化输出
#include <stdio.h>
int main()
{
//在VScode测出的指针大小为8字节
printf("指针大小: %d\n", sizeof(void*));
int a = 1;
int* p = &a;
long b = (long)p;
printf("p = %p\n", p);
printf("b = %lx\n", b);
return 0;
}
6. 指针与指针
任意类型的指针都可以自由的强制类型转换,只不过转换后的指针进行解引用以及加法操作时,可以申请移动或访问的字节大小不同
这里推荐两篇指针的博客,看完之后就理解上面说的内容了
详谈【指针解引用】与【指针加整数】_指针解引用之后-优快云博客
三、 整型提升:
在面对低字节到高字节的转换,发生的就是整型提升(提升针对的是原本类型)
【规则】
1. 无符号数的提升,高位补0
2. 有符号数的提升,高位补符号位
四、整型截断
高字节转换为低字节,发生截断
【规则】
1. 截断从低位开始一个一个数,数到对应的字节处截断
2. 截断之后,如果是个无符号数,那最高位的数字就是数值位
3. 截断之后,如果是个有符号数,那最高位的数字就是符号位