取值范围
INT_MIN : -2147483648 // 4 字节整型 int 的 最小值
INT_MAX : 2147483647 // 4 字节整型 int 的 最大值
LONGLONG_MIN: -9223372036854775808 // long long 的最小值
LONGLONG_MIX: 9223372036854775807 // long long 的最大值
解释
在计算机存储中,整型 int 一般都是4字节,即32个比特。
int
是一种有符号整数,所以最高位是符号位,0 代表为正数,1 代表为负数。换句话说,32比特的整型 int 只有 [0, 30] 为存放数值, 第31位存放符号标志。
其中,负数又通过补码的形式存储。
正数和负数绝对值的取值范围不相等
按道理来说,正数最高位 0, 其余31位存放数值。负数最高位为 1, 其余31位也是存放数值。所以正数和负数的绝对值大小的取值范围应该相等。
但是,由于 0 的存在,使得负数绝对值表示的范围要比正数绝对值表示的范围大1。
这很好理解。0的二进制表示为32位全为0,而0不是正数也不是负数,所以0占用了1位本该属于正数(最高位为0)的位置,所以正数的表示范围要少1。
int的取值范围 : 2 31 < = i n t < = 2 31 2^{31} <= int <= 2^{31} 231<=int<=231
位运算,求出整型int的取值范围
最小值
:绝对值最大的负数。最高位为1,其余31位全为0。
最大值
:绝对值最大的整数。最高位为0,其余31位全为1。
整型的最小值按位取反即为整型最大值。反之,亦然。
最小值 : 1 << 31
最大值: ~(1<<31)
还有一个小细节: 2 29 < 1 0 9 < 2 30 2^{29} < 10^9 < 2^{30} 229<109<230 。为 2 29 = 536870912 2^{29} = 536870912 229=536870912。 2 30 = 1073741824 2^{30} = 1073741824 230=1073741824 。
代码展示
输出int能表示的最小值和最大值
#include <iostream>
int main()
{
int INT_MIN = 1 << 31;
int INT_MAX = ~(1 << 31);
std::cout << "int的最小值: " << INT_MIN << std::endl;
std::cout << "int的最大值: " << INT_MAX << std::endl;
return 0;
}
同样,我们也可以输出 long long
的取值范围
#include <iostream>
int main()
{
const long long ONE = 1;
int LONGLONG_MIN = ONE << 63;
int LONGLONG_MAX = ~(ONE << 63);
std::cout << "long long 的最小值: " << LONGLONG_MIN << std::endl;
std::cout << "long long 的最大值: " << LONGLONG_MAX << std::endl;
return 0;
}