C++整形变量临界值问题思考

Posted FightingBoom

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++整形变量临界值问题思考相关的知识,希望对你有一定的参考价值。

最近调试代码时,遇到了一个问题。

程序中定义了 int 类型的变量,在代码中做自增操作,当达到某一阈值(等于15)的时候,会做一些特殊处理。

实际测试发现,该阈值在特定场景,无论如何都达不到。

最后发现该变量为 int 类型,猜测很可能是远远超过 15 ,且已经变为负数了,导致无法快速的从 0 开始加到 15 。

于是想着一探究竟,看下变量在最大值时,再加一会发生什么。

代码如下

#include <iostream>

using namespace std;

int main()

    int iCount = 0;
    unsigned int uiCount = 0;

    iCount = INT32_MAX;     // 有符号数,加一,会变为负数
    iCount += 1;
    cout << "MAX:" << INT32_MAX << " iCount(MAX + 1) = " << iCount << endl;

    uiCount = INT32_MAX;
    uiCount += 1;
    cout << "MAX:" << INT32_MAX << ", uiCount(MAX + 1) = " << uiCount << endl;

    uiCount = UINT32_MAX;   // 无符号数,加一,从0开始
    uiCount += 1;
    cout << "MAX:" << INT32_MAX << ", uiCount(MAX + 1) = " << uiCount << endl;


    cout << "iCount = " << iCount << ", uiCount = " << uiCount << endl;

    return 0;

实际测试结果如下

MAX:2147483647 iCount(MAX + 1) = -2147483648
MAX:2147483647, uiCount(MAX + 1) = 2147483648
MAX:2147483647, uiCount(MAX + 1) = 0
iCount = -2147483648, uiCount = 0

对比可以发现

  • int :在最大值时加一,会变为最小值
  • unsigned int:在最大值时加一,会变为 0

后续在写代码时,应该明确变量类型,类似这种自增、自减的变量,一定要考虑是否有可能为负数。如果不会为负数,则应该从变量类型做限制,避免出现异常情况。

以上是关于C++整形变量临界值问题思考的主要内容,如果未能解决你的问题,请参考以下文章

C++整形变量临界值问题思考

小学生学C++的几个问题

C++整形变量的定义

变量和基本类型C++

算法第三章总结

静态常量非整形成员变量的初始化问题