C/C++整型上下限INT_MAX INT_MIN及其运算

本文详细解析了C语言中INT_MAX和INT_MIN的含义及其数值大小,并介绍了这两个常量在运算过程中可能出现的特殊情况,例如INT_MAX+1=INT_MIN等。此外,还提到了当整数超出范围时如何选择合适的数据类型。

C中常量INT_MAX和INT_MIN分别表示最大、最小整数,定义在头文件limits.h中。

1. INT_MAX,INT_MIN数值大小

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

2. 关于INT_MAX INT_MIN的运算

由于二进制编码按原码、补码和反码的规则进行运算,所有程序中对INT_MAX和INT_MIN的运算应当格外注意,在出现溢出的时候,不遵循数学规则。

INT_MAX + 1 = INT_MIN

INT_MIN - 1 = INT_MAX

abs(INT_MIN) = INT_MIN

比较有趣的是,INT_MAX + 1 < INT_MAX, INT_MIN - 1 > INT_MIN, abs(INT_MIN) < 0.

### 含义 `setSceneRect` 通常是 Qt 框架中 `QGraphicsScene` 类的一个成员函数,用于设置场景的矩形区域。`setSceneRect(INT_MIN / 2, INT_MIN / 2, INT_MAX, INT_MAX);` 表示将场景的矩形区域设置为一个以 `(INT_MIN / 2, INT_MIN / 2)` 为左上角坐标,宽度为 `INT_MAX`,高度为 `INT_MAX` 的矩形。这里的 `INT_MAX` 和 `INT_MIN` 分别是 C++ 中表示最大最小整数的常量,定义在头文件 `limits.h` 中,`INT_MAX` 的值为 2147483647,`INT_MIN` 的值为 -2147483648 [^1][^2]。 ### 作用 - **扩大场景范围**:将场景的范围设置得非常大,几乎覆盖了整个整数坐标范围,这样可以让场景能够容纳非常大范围的图形项,避免因为场景范围过小而导致图形项超出场景边界显示不完整。 - **方便图形布局**:在设计图形界面时,如果不确定图形项的具体位置和大小,将场景范围设置得足够大可以避免因布局调整而频繁更改场景矩形。 ### 使用场景 - **大型图形绘制**:在绘制地图、流程图、电路图等大型图形时,由于图形的范围可能非常大,使用这种大范围的场景可以确保整个图形都能在场景中正常显示。 - **动态图形布局**:当图形项的位置和大小是动态变化的,或者需要在运行时添加大量图形项时,将场景范围设置得足够大可以避免因图形项超出场景范围而导致显示问题。 ### 可能存在的问题 - **性能问题**:将场景范围设置得过大可能会导致性能下降,因为 Qt 需要处理更大的区域,包括绘制、事件处理等。特别是在图形项数量较多时,性能问题可能会更加明显。 - **坐标越界风险**:由于使用了 `INT_MAX` 和 `INT_MIN`,在进行坐标计算时可能会出现越界的情况,导致程序崩溃或产生不可预期的结果。例如,当对场景中的图形项进行移动、缩放等操作时,如果计算结果超出了 `INT_MAX` 或 `INT_MIN` 的范围,就会发生越界错误 [^2]。 - **内存占用问题**:大范围的场景可能会占用更多的内存,尤其是在使用一些需要缓存图形数据的功能时,可能会导致内存使用量急剧增加。 ### 代码示例 ```cpp #include <QApplication> #include <QGraphicsScene> #include <QGraphicsView> #include <limits.h> int main(int argc, char *argv[]) { QApplication a(argc, argv); // 创建场景 QGraphicsScene scene; // 设置场景矩形 scene.setSceneRect(INT_MIN / 2, INT_MIN / 2, INT_MAX, INT_MAX); // 创建视图 QGraphicsView view(&scene); view.show(); return a.exec(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值