C语言的整数溢出机制

总结C语言的整数溢出机制

整数溢出机制的分类

  1. 无符号
  2. 有符号

无符号整数溢出处理机制

在C标准中,这类整数溢出机制是得到了具体的定义的。公式为:

1
2
3
4
5
6
7
2^(8*sizeof(type));
//如果某个数溢出,则将这个数以该公式作模运算。

unsigned char x = 258;

则实际上表示为:
x % 2^(8*sizeof(char)) = 2;

有符号整数溢出机制

这里溢出在标准中没有被定义,但是各个编译器的实现是差不多的:

如果是正向溢出(就是大于可以表示的最大的整数)其被当成了一个负数,则-1然后取反,如果是反向溢出则取反然后+1

x2^type的位数还要大时,只取低2^type的位数位,2^type的位数是类型的位数。如:

1
2
3
char x = 400;
printf("%c",x);
//由于x是char类型,所以它只占8bit。2^8 = 256 ,所以只取低bbit。则400取第八位->10010000b(144),然后在进行-1取反 结果为-112

参考资料

https://coolshell.cn/articles/11466.html

https://zhuanlan.zhihu.com/p/28563004


C语言的整数溢出机制
https://ysc2.github.io/ysc2.github.io/2023/12/12/C语言的整数溢出机制/
作者
Ysc
发布于
2023年12月12日
许可协议