【C语言】 整型提升和整型溢出

本文详细介绍了C语言中整型溢出的现象,包括无符号整型和有符号整型的溢出行为。对于整型提升,文章解释了这是由于隐式类型转换导致的,特别是在计算过程中,较低类型的操作数会被提升到默认整型精度。通过具体的例子,分析了整型提升的过程和可能导致的误解,强调在编程中注意这些细节以避免错误。

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

首先什么是整型溢出?

对于整型溢出,分为无符号整型溢出和有符号整型溢出。
对于unsigned整型溢出,C语言的定义是——“溢出后的数会以2^(8*sizeof(type))作模运算”,也就是说,如果一个unsigned char(1字符,8bits)溢出了,会把溢出的值与256求模。例如:

unsigned char x = 0xff; printf("%d\n", ++x);

上面的代码会输出:0 (因为0xff + 1是256,与2^8求模后就是0)

对于signed整型的溢出,C的规范定义是“undefined behavior”,也就是说,编译器爱怎么实现就怎么实现。对于大多数编译器来说,算得啥就是啥。比如:

signed char x =0x7f; //注:0xff就是-1了,因为最高位是1也就是负数了printf("%d\n", ++x);

另外,千万别以为signed整型溢出就是负数,这个是不定的。

整型提升

C的整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。相信大家看到这里也是一头雾水,接下来我们先讲解一下隐式类型转换

1、 隐式类型转换:

int main(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值