【C++】详解 INT_MAX 和 INT_MIN(INT_MAX 和 INT_MIN是什么?它们的用途是什么?如何防止溢出?)

本文介绍了C++中的INT_MAX和INT_MIN,它们分别代表整型变量的最大正整数和最小负整数。文章讨论了这两个常量的用途,如何避免溢出,以及它们在LeetCode面试题中的应用,如整数反转问题的解决方案。

目录

一、前言

 二、什么是 INT_MAX 和 INT_MIN ?

三、INT_MAX 和 INT_MIN 的用途 

四、如何避免溢出问题出现 ?

 五、 INT_MAX 和 INT_MIN 的运算

 六、leetcode 常考面试题

 七、共勉


一、前言

    大家在平时刷 leetcode 的时候,肯定会碰到 溢出问题 ,之后查看题解,大部分题解都会通过 INT_MAX 和 INT_MIN 来进行解决。那么为了弄清楚什么是 INT_MAX 和 INT_MIN ,我们收集了一些资料,总结如下哦!!

 二、什么是 INT_MAX 和 INT_MIN ?

     INT_MAX  和  INT_MIN 是 C++ 的两个预定义宏,代表了整型变量能够存储的最大正整数和最小负整数,分别为 2147483647-2147483648。这两个宏在头文件 <climits> 中定义。

    INT_MAX 表示一个 32 位符号整数所能够表示的最大值,也就是 2^31 − 1。而 INT_MIN 则表示最小的负整数。这个值是相对于二进制补码表示法的,也就是说,负数的范围比正数大 1。

代码示例: 

#include <iostream>
#include <climits>
using namespace std;

int main() 
{
    int max_int = INT_MAX;
    int min_int = INT_MIN;
    cout << "The maximum value that can be stored in an int variable is: " << max_int << endl; 
    // 2147483647
    cout << "The minimum value that can be stored in an int variable is: " << min_int << endl; 
    // -2147483648
    
    return 0;
}

 【注意】:这些宏仅适用于 32 位整型变量,如果使用 64 位整型变量,需要使用其他预定义宏,如 LONG_LONG_MAX  和 LONG_LONG_MIN,代表能够存储的最大/最小长整数。

三、INT_MAX 和 INT_MIN 的用途 

 INT_MAX 是个很大的数,如果想得到数组中最小值,可以先将 min1(下方代码中的一个变量)设成 INX_MAX,这样就不需要 const int 定义一个很大的数了:

int min1 = INT_MAX;
for(int i = 0; i < n; i++)
{
	if(arr[i] < min1)
	{
		min1 = arr[i];
	}
}

四、如何避免溢出问题出现 ?

  【C/C++】中常量 INT_MAX 和 INT_MIN 分别表示最大、最小整数 。 INT_MAX , INT_MIN 数值大小因为int占4字节32位,根据二进制编码的规则,INT_MAX = 2^31-1,INT_MIN= -2^31。C/C++中,所有超过该限值的数,都会出现溢出,出现 warning,但是并不会出现error。如果想表示的整数超过了该限值,可以使用长整型 long long 占8字节64位。

 五、 INT_MAX 和 INT_MIN 的运算

C/C++ 语言中 int 类型是 32 位的,范围是 -2147483648 到 2147483647 。 

  • 最轻微的上溢是 INT_MAX + 1,结果是 INT_MIN
  • 最严重的上溢是 INT_MAX + INT_MAX,结果是 -2。
  • 最轻微的下溢是 INT_MIN - 1,结果是是 INT_MAX
  • 最严重的下溢是 INT_MIN + INT_MIN,结果是 0 。

 六、leetcode 常考面试题

题目:整数反转
链接:整数反转

class Solution {
public:
    int reverse(int x) 
    {
        // to_string 函数的主要作用是将  整形 转换为  字符串
          string s = to_string(x);
          int l = 0;
          // 考虑 负数
          if(s[l]=='-')
          {
              l++;
          }
          // 将 数据部分 进行反转
          std::reverse(s.begin()+l,s.end());
          // INT_MAX 和 INT_MIN  是C++内置的常量
          const int k1 = INT_MAX,k2 = INT_MIN;
          string t1 = to_string(k1),t2 = to_string(k2);
          if(s[0]=='-')
          {
            if(s.size()==t2.size() && s > t2)
            {
                return 0;
            }
          }
          else
          {
            if(s.size()==t1.size() && s > t1)
            {
                return 0;
            }

          }
             // stoi() 将字符串转换为  整形
           x = stoi(s);
           return x;
    }
};

 七、共勉

  以下就是我对 详解 INT_MAX 和 INT_MIN 的理解,如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对C++  vector 类的理解,请持续关注我哦!!! 

改为c++14 #include <iostream> #include <vector> #include <unordered_map> #include <algorithm> // 用于max_element/min_element #include <climits> // 用于INT_MIN/INT_MAX using namespace std; struct PositionData { int count = 0; int first = INT_MAX; int last = INT_MIN; vector<int> positions; }; int main() { // 读取输入 int n; cin >> n; vector<int> a(n); for (int i = 0; i < n; ++i) { cin >> a[i]; } // 创建数据结构 unordered_map<int, PositionData> data; // 遍历数组填充数据 for (int idx = 0; idx < n; ++idx) { int num = a[idx]; auto& d = data[num]; // 自动创建新条目 d.count++; d.first = min(d.first, idx); d.last = max(d.last, idx); d.positions.push_back(idx); } // 计算sum_maxx_list int sum_max = 0; vector<int> x_list; for (const auto& [num, info] : data) { sum_max += min(info.count, 3); if (info.count >= 3) { x_list.push_back(num); } } // 处理无x的情况 if (x_list.empty()) { cout << sum_max << endl; return 0; } // 计算LR int L = INT_MIN; int R = INT_MAX; for (int x : x_list) { L = max(L, data[x].first); R = min(R, data[x].last); } // 处理无重叠情况 if (L >= R) { sum_max -= x_list.size(); cout << sum_max << endl; return 0; } // 二分查找处理 int t = 0; for (int x : x_list) { const auto& pos = data[x].positions; int left = 0, right = pos.size() - 1; bool found = false; while (left <= right) { int mid = (left + right) / 2; if (pos[mid] > L && pos[mid] < R) { found = true; break; } else if (pos[mid] <= L) { left = mid + 1; } else { right = mid - 1; } } if (!found) { t++; } } // 最终结果 sum_max -= t; cout << sum_max << endl; return 0; }
03-16
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值