C语言【类型转换】总结

前言

        在写了这么久的习题博客,我发现其中非常爱考查的一个知识就是类型的转换,比如不同类型之间的加减乘除、比较大小和赋值运算等,这里面涉及最为多的就是隐式类型转换,所以在此专门写一个关于类型转换的知识点总结,也希望大家多多支持,一起努力!

一、类型转换

        关于类型转换,只需要记住:两种类型有关联,才可以进行类型转换。并且我们没必要区分隐式类型转换和强制类型转换,其转换原则都是一样的,不同点在于隐式类型转换是自动完成的,而强制类型转换是需要我们介入后才可以完成。


这里需要注意的是,类型转换中会产生临时变量,临时变量都是右值,无法访问其地址空间


二. 关联的类型

关联类型例子类型转换的类型
整型之间

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. 截断之后,如果是个有符号数,那最高位的数字就是符号位

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

终将向阳而生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值