1. 整数取值范围的基础认知
计算机中的整数存储方式与我们日常理解的数学整数有着本质区别。在内存中,整数是以二进制形式存储的固定长度数据块,这个"固定长度"就是决定取值范围的底层因素。以最常见的32位系统为例,一个整型变量默认分配4字节(32位)存储空间。
重要提示:初学者常犯的错误是认为int类型在32位和64位系统下范围相同。实际上,C/C++标准仅规定int至少为16位,具体实现由编译器决定。现代编译器中,32位和64位系统通常都采用32位int。
1.1 有符号与无符号的区别
有符号整数(signed)的最高位用作符号位(0正1负),实际数值范围被一分为二。例如32位有符号int的范围是-2³¹到2³¹-1(-2,147,483,648到2,147,483,647)。而无符号整数(unsigned)所有位都表示数值,32位unsigned int的范围是0到2³²-1(0到4,294,967,295)。
c复制// 典型取值范围示例(32位系统)
int a; // -2147483648 ~ 2147483647
unsigned int b; // 0 ~ 4294967295
1.2 不同语言中的整数类型
各编程语言对整数类型的实现存在差异:
- Java:明确固定int为32位,long为64位
- Python:int类型自动扩展,理论上仅受内存限制
- Go:int/uint根据系统位数变化(32位或64位)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数值溢出原理深度解析
当计算结果超出数据类型能表示的范围时,就会发生整数溢出。这种情况不会直接引发错误(某些语言如Go会panic),但会导致数值"环绕"。
2.1 二进制层面的溢出机制
以8位无符号整数为例(范围0-255):
- 255 + 1 = 0(二进制11111111 + 1 = 100000000,高位截断)
- 0 - 1 = 255(二进制00000000 - 1 = 11111111,借位丢失)
c复制// 溢出示例
uint8_t x = 255;
x++; // x现在为0
