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