不知道大家有没有遇到过这种要求:“返回值必须是int,如果整数数超过 32 位有符号整数范围 [−2^31, 2^31 − 1]
,需要截断这个整数,使其保持在这个范围内。例如,小于 −2^31
的整数应该被固定为 −2^31
,大于 2^31 − 1
的整数应该被固定为 2^31 − 1
题目链接:. - 力扣(LeetCode)
若已知int能表示的最大值与最小值,本题直接如下截断即可
return max(min(ans, int_max), int_min);//ans表示未经处理正确答案
那么问题来了,如何获取int的最值?
1.通过C++已有库
在C++中,可以使用<limits>
头文件中的std::numeric_limits
模板类来获取int
类型的最大值和最小值。下面是示例代码:
#include <iostream>
#include <limits>
int main() {
// 获取int类型的最大值
int max_int = std::numeric_limits<int>::max();
std::cout << "最大值:" << max_int << std::endl;
// 获取int类型的最小值
int min_int = std::numeric_limits<int>::min();
std::cout << "最小值:" << min_int << std::endl;
return 0;
}
这段代码中,std::numeric_limits<int>::max()
返回int
类型的最大值,std::numeric_limits<int>::min()
返回int
类型的最小值。
2.通过移位运算
#include <iostream>
int main() {
// 计算int类型的最大值
int max_int = (1 << 31) - 1; // 或者使用 0x7FFFFFFF
std::cout << "最大值:" << max_int << std::endl;
// 计算int类型的最小值
int min_int = -(1 << 31); // 或者使用 0x80000000
std::cout << "最小值:" << min_int << std::endl;
return 0;
}
这段代码中,(1 << 31) - 1
计算出32位中除了符号位外全为1的二进制数,即011...1
,即为int
类型的最大值。而-(1 << 31)
计算出32位中符号位为1,其余位为0的二进制数,即100...0
,即为int
类型的最小值。