C++ short; int; long; long long; 等整数类型取值范围,以及最大值 max abs value (64位)
以 long long 为例,占用64比特,最高位(左边第一位)为符号位,剩余63bit,可表示的最大正整数是 pow(2,63)-1 (注意:0的表示占用了一个值,因此减1)
理论计算数值如下:
Step1:9,223,372,036,854,775,808

Step2:9,223,372,036,854,775,807

代码验证:
1 int main() { 2 using namespace std; 3 for (long long i = 9223372036854775806; i <= 9223372036854775807; i++) { 4 cout << i << endl; 5 } 6 return 0; 7 }
输出:
1 9223372036854775806 2 9223372036854775807 3 -9223372036854775808 4 -9223372036854775807 5 -9223372036854775806 6 -9223372036854775805
......
输出第2行达到正整数范围内最大值:9223372036854775807 第三行之后累加修改了最高符号位(最左边的1bit)之后得到负整数值 -9223372036854775808
注意:
1:0 的处理占了一个值。
2:由此可判断最高位符号位1表示负数,0表示正数。巧妙的设计。
在此之后继续累加,进入负整数abs逐步减小向0靠近。
此实验验证了 long long 取值范围,其可以表示的最大正整数是9223372036854775807 ,最小负整数是-9223372036854775808 最大绝对值 abs max 是9223372036854775808
类似方法可以测试其他整数类型的取值范围
| 类型 | bit | 最大正整数 | 最小负整数 | 最大绝对值 max abs | 数量级 |
| short; short int | 16 | pow(2,16-1)-1 = 32767 | -32768 | 32768 | 3万 |
| int | 32 | pow(2,32-1)-1 = 2147483647 | -2147483648 | 2147483648 | 20亿 |
| long | 32 | pow(2,32-1)-1 = 2147483647 | -2147483648 | 2147483648 | 20亿 |
| long long | 64 | pow(2,64-1)-1 = 9223372036854775807 | -9223372036854775808 | 9223372036854775808 | 9百兆 |
unsigned 取消了最高的符号位,计算时pow2为底时,指数不减一,最大绝对值max abs value扩大,但不能表示负数。
了解数值的表示范围在设计程序的时候对于计算问题的边界或者计数问题的分块分层具有指导意义。尤其是顶层表示层使用了整型不溢出的语言设计时(例如python),底层计算层的对接需要考虑计算机本身硬件的限制。

浙公网安备 33010602011771号