一、int 的取值范围及溢出原因
1
1
1个字节(
B
y
t
e
Byte
Byte) =
8
8
8个比特位(
b
i
t
bit
bit)
i
n
t
int
int 型在
32
32
32位和
64
64
64位操作系统中取值范围一样,(
l
o
n
g
long
long
i
n
t
int
int 型有不同)
都为
【
−
2147483648
,
2147483647
】
【-2147483648,2147483647】
【−2147483648,2147483647】即
【
−
2
31
,
2
31
−
1
】
【-2^{31},2^{31}-1】
【−231,231−1】
二进制形式为:xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
x为
0
0
0或
1
1
1;
而超出这个范围就会溢出;
如下代码:
#include <iostream>
int main()
{
int a = 2147483647;
std::cout << "a为int型变量" << '\n';
std::cout << "a的最大值为:" << a << '\n';
std::cout << "a的最大值再加1的值为:" << a + 1 << std::endl;
return 0;
}
运行结果为:
a为int型变量
a的最大值为:2147483647
a的最大值再加1的值为:-2147483648
即发生溢出;
二、溢出问题的解决
对所用数据以及代码执行过程中所出现的数学进行大致判断,看是否会超过 i n t int int型的范围,如下:
#include <iostream>
#include <algorithm>
#include <cmath>
int main()
{
printf("2^31 - 1的值为%12.2f\n", pow(2, 31) - 1);
printf("10^9的值为%12.2f\n", pow(10, 9));
printf("10^10的值为%12.2f\n", pow(10, 10));
std::cout << '\n';
std::cout << "2^31 - 1的值为" << pow(2, 31) - 1 << '\n';
std::cout << "10^9的值为" << pow(10, 9) << '\n';
std::cout << "10^10的值为" << pow(10, 10);
return 0;
}
运行结果
2^31 - 1的值为2147483647.00
10^9的值为1000000000.00
10^10的值为10000000000.00
2^31 - 1的值为2.14748e+009
10^9的值为1e+009
10^10的值为1e+010
可见,当数据在
2
31
2^{31}
231和
1
0
9
10^{9}
109范围附近时,就可能会发生溢出现象;
对所用数据以及代码执行过程中所出现的数据进行大致判断,如果有超出范围的可能性,则选择用
l
o
n
g
long
long
i
n
t
int
int 型或者
l
o
n
g
long
long
l
o
n
g
long
long 型;
E v e A h A c d w 18 EveAhAcdw18 EveAhAcdw18