C++ 实战之强制转换和自动类型提升

何时需要强制转换?何时又不需要?下面我们一起对比一下下面两处代码

cpp 复制代码
long lastNum = (long)INT_MIN-1;
cpp 复制代码
int curNum = 5;
if(curNum <= lastNum)
{
    ...
}

【知识点补充】

首先补充一个小知识点。 32位系统中 int 类型的最大值 INT_MAX 和最小值 INT_MIN,以及它们的计算方式。下面是一个简单的表格:

名称 值 计算方式
INT_MAX 2147483647 2^31 - 1
INT_MIN -2147483648 -2^31

其中INT_MAX:在32位有符号整数中,最高位(符号位)为0,表示正数,其余的所有位都为1时,表示的是最大的正数。因此,最大值是 2^31 - 1【具体应用等比数列求和公式:1 * 2^0 + 1 * 2^1+ ... + 1 * 2^30=(1-2^31)/(1-2)=2^31-1】即2147483647。

INT_MIN:在32位有符号整数中,最高位(符号位)为1,表示负数,其余位都为0表示的是最小的负数。因此,最小值是 -2^31 = -2147483648。

【解惑】

下面我们一起来思考一下。为什么第一处这里需要强制转换?而比较的时候curNum <= lastNum 不需要强制转换呢,这是c++的什么用法?

在C++中,INT_MIN 是 int 类型能够表示的最小值。在标准中,这个值是一个负数。当你尝试对一个负数 INT_MIN 进行减法操作时,如果直接将其作为 int 类型处理,可能会遇到整数溢出的问题,因为 int 类型的最小值再减去一个正数会导致数值无法在 int 类型的范围内表示。

这就是为什么在初始化 lastNum 时需要进行强制类型转换 (long)INT_MIN,将 INT_MIN 转换为 long 类型,这样 lastNum 就有足够的空间来存储减去 1 之后的值,而不会发生溢出。

在比较 node->val <= lastNum 时,由于 lastNum 已经是 long 类型,而 node->val 是 int 类型,C++ 会自动进行类型提升(type promotion),将 int 类型的 node->val 提升到 long 类型后再进行比较。这种类型提升是安全的,因为 int 类型的值总是能够无损地转换为 long 类型。

总结来说,这里的强制类型转换是为了避免初始化时的整数溢出,而在比较时的自动类型提升则是 C++ 的类型转换规则所允许的。

相关推荐
(Charon)13 分钟前
【C++面试】程序崩溃如何定位:从Segmentation fault到GDB、Core Dump与ASan
开发语言·c++
汉克老师16 分钟前
GESP2026年9月认证C++七级( 第三部分编程题(1、必经之路))精讲
c++·gesp·小学生·学c++编程
ebiobiz31 分钟前
Zig 嵌入式底层库选择与 build.zig 组织指南
c语言·c++·嵌入式硬件·mcu
漂流瓶jz2 小时前
UVA-11491 奖品的价值 题解答案代码 算法竞赛入门经典第二版
c++·算法·图论·题解·aoapc·算法竞赛入门经典·uva
weixin_307779136 小时前
C++代码实现MATLAB中的dlarray函数功能
开发语言·c++·算法·matlab
Frank_refuel9 小时前
C++11之一场名为“搬家”的 C++ 之旅
开发语言·c++
hetao173383711 小时前
2026-10-03~04 hetao1733837 的刷题记录
c++·算法
longlongzihan12 小时前
从LeetCode 70. 爬楼梯看动态规划:如何精准推导状态转移方程?
c++·算法·leetcode·动态规划
潼心1412o14 小时前
C++初阶(长期更新)第6讲:类和对象(下)
开发语言·c++·算法
-森屿安年-15 小时前
按身高排序
c++·算法