有符号整数取值范围为$[-2^{n-1},\; 2^{n-1}-1]$,无符号整数为$[0,\; 2^n-1]$;前者最高位为符号位、采用补码,后者所有位表数值,二者总取值个数均为$2^n$。

基本数据类型取值范围的公式,关键在于区分有符号(signed)和无符号(unsigned)两种情况,并不是简单套用 $2^{n-1}$ 或 $2^{n-1}-1$ 就能通用。
有符号整数的取值范围
对于 n 位有符号整数(如 int8、int16),最高位是符号位,剩余 $n-1$ 位表示数值。采用补码表示法时:
- 最小值是 $-2^{n-1}$(例如 int8:$-2^7 = -128$)
- 最大值是 $2^{n-1} - 1$(例如 int8:$2^7 - 1 = 127$)
- 所以完整范围是 $[-2^{n-1},\; 2^{n-1} - 1]$
无符号整数的取值范围
对于 n 位无符号整数(如 uint8、uint16),所有位都用于表示数值,没有符号位:
- 最小值恒为 0
- 最大值是 $2^n - 1$(例如 uint8:$2^8 - 1 = 255$)
- 所以完整范围是 $[0,\; 2^n - 1]$
为什么容易混淆这两个公式
常见误区是把有符号类型的“最大值”公式 $2^{n-1} - 1$ 错当成通用规则,忽略了最小值的负向扩展,也未区分无符号类型中 $2^n - 1$ 的逻辑。补码机制决定了正负数不对称——多出一个负数(比如 int8 能表示 -128,但不能表示 +128)。
实际编程中的检查建议
写代码时别靠心算,优先使用语言内置常量:
- C/C++:查
(如 INT8_MIN、UINT16_MAX) - Java:用
Byte.MIN_VALUE、Short.MAX_VALUE等静态字段 - Python 虽无原生固定位宽类型,但
numpy中如np.int32可用iinfo查询











