首先什么是整型溢出?
对于整型溢出,分为无符号整型溢出和有符号整型溢出。
对于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()
{

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

被折叠的 条评论
为什么被折叠?



