C语言 ——隐式类型转换和算数转换

文章详细介绍了C语言中表达式求值时的整型提升和算数转换规则。整型提升涉及short、char类型提升为int,对于无符号整型则是高位补0。算数转换则是在int及以上类型间进行,统一为较高类型。文中通过实例解释了这些概念,并提醒读者注意类型转换可能导致的陷阱,如在比较运算中的类型提升可能导致预期外的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

表达式求值顺序一般是按照操作符的优先级顺序来决定,但是,有些表达式求值的过程中还涉及到类型的转换与统一

目录

隐式类型转换

整型提升

什么时候会发生整型提升

算数转换


隐式类型转换

C语言在求值计算时总是存在 short,char类型与 int 类型的表达式计算,而此时我们就应该进行整型提升将 int 以下的类型提升成一个整型再进行计算。

那整型提升该怎么升呢?


整型提升

整型提升是对该数的二进制补码按照变量的数据类型的符号位来提升的

补充:一个整数如何整型提升与数据类型也有关系,以上只是针对于有符号整型,那么对于无符号整型的提升,我们采取高位直接补0的方式。


实例:

 这里为什么计算结果是这个玩意儿呢?难道不是128嘛。请继续看下去:


那么来看看这道小题:猜猜打印结果

??只会打印c,因为前两个会发生整形提升。前面补符号位1

0xb6十六进制转换成二进制以后是1011 0110,符号位是1,所以进行整形提升就在前面补1,然后求原码进行判断比较。 


什么时候会发生整型提升

  • charshort等小于int类型的数据,在参与算术运算(比如加法、减法、乘法、除法等)或者按位运算(像&|^等)或关系运算(如==!=<><=>=)或逻辑运算(像逻辑与(&&)和逻辑或(||)运算),会自动提升为int类型。
  • 如果函数参数要求是int类型等,而传入的是charshort等小于int类型的数据,会发生整型提升,将其转换为int类型再传递给函数。例如有函数void func(int num),调用func('a')时,字符'a'对应的char类型值会先进行整型提升转换为int类型传入函数中。

算数转换

算数转换的对象是 int 之上的类型之间的转换。就是说,以下的任意两种类型发生计算的时候,会发生类型统一,都统一成较高的类型(就是图中的向上转换)


小题一道:

#include <stdio.h>
int i=0;        //全局变量未给初始值时,自动默认为0
int main()
{
    i--;
    if (i > sizeof(i))
    {
        printf(">");
    }
    else
    {
        printf("<");
    }
    return 0; 
}

该题十分隐蔽,博主也掉入陷进,现在分享给你们:

变量 i 是 int 类型的数,而 sizeof(i) 准确来说是unsigned int类型,通过上面的图表你会发现,unsigned int 在int 上面,所以说编译器执行到该行时偷偷的发生了算数转换,统一转换成了unsigned int类型所以式子左边的-1转换成unsigned int 就变成了一个极大地的字,远远的大于 sizeof(i)的值。其实就是2^31+1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

CR0712

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

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

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

打赏作者

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

抵扣说明:

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

余额充值