- 前言
- 一、常见各整数类型的字节数和取值范围
- 1. 以64位编译器为例
- 二、整数溢出
- 总结
前言
某天晚上突然室友问我,鹏哥,整数溢出了会咋样?我恰好也不知道,就说会崩溃。但到底会怎么样呢?本人决定亲自试验一番
一、常见各整数类型的字节数和取值范围 1. 以64位编译器为例
代码如下(示例):
#include#include //limits.h专门用于检测整型数据数据类型的表达值范围。 int main() { printf("short的字节数:%zdn", sizeof(short)); printf("short的范围:%d-----%dn", SHRT_MIN, SHRT_MAX); printf("nunsigned short的字节数:%zdn", sizeof(unsigned short)); printf("unsigned short的范围:%u-----%un", 0, USHRT_MAX); printf("nint的字节数:%zdn", sizeof(int)); printf("int的范围:%d-----%dn", INT_MIN, INT_MAX); printf("nunsigned int的字节数:%zdn", sizeof(unsigned int)); printf("unsigned int的范围: % u---- - % un", 0, UINT_MAX); printf("nlong的字节数:%zdn", sizeof(long)); printf("long的范围: % ld---- - % ldn", LONG_MIN,LONG_MAX); printf("nunsigned long的字节数:%zdn", sizeof(unsigned long)); printf("unsigned long的范围: % ld---- - % ldn",0, ULONG_MAX); printf("nlong long 的字节数:%zdn", sizeof(long long)); printf("long long的范围: % lld---- - % lldn", LLONG_MIN, LLONG_MAX); return 0; }
结果如下:
注意: 在C语言中只规定了short占用的储存空间不能多于int,long占用的储存空间不能少于int。所以以上可看到,在64位操作机下int和long均为4个字节。
二、整数溢出如果整数超出了相应类型的取值范围会怎么样呢?
int main()
{
int i = 2147483647;
unsigned int j = 4294967295;
printf("%d %d %dn", i, i + 1, i + 2);
printf("%u %u %un", j, j + 1, j + 2);
// printf()函数使用%u说明显示unsigned int类型的值
return 0;
}
结果如下:
2147483647 -2147483648 -2147483647
4294967295 0 1
总结
对于整数溢出的问题,其实系统并未报错。无符号整型unsigned int 的溢出相当于秒针到最大值时,j 重新从起始点0出发。而有符号整型int类型的变量i则从-2147483648开始。
注意: 溢出行为是C语言未定义的行为,以上为vs 2022在64位情况下的实验。



