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++ 的类型转换规则所允许的。

相关推荐
liulilittle6 小时前
OPENPPP2 Code Analysis One
网络·c++·网络协议·信息与通信·通信
Morwit6 小时前
*【力扣hot100】 647. 回文子串
c++·算法·leetcode
天赐学c语言7 小时前
1.7 - 删除排序链表中的重要元素II && 哈希冲突常用解决冲突方法
数据结构·c++·链表·哈希算法·leecode
w陆压7 小时前
12.STL容器基础
c++·c++基础知识
龚礼鹏8 小时前
Android应用程序 c/c++ 崩溃排查流程二——AddressSanitizer工具使用
android·c语言·c++
qq_401700418 小时前
QT C++ 好看的连击动画组件
开发语言·c++·qt
额呃呃9 小时前
STL内存分配器
开发语言·c++
七点半7709 小时前
c++基本内容
开发语言·c++·算法
嵌入式进阶行者9 小时前
【算法】基于滑动窗口的区间问题求解算法与实例:华为OD机考双机位A卷 - 最长的顺子
开发语言·c++·算法
嵌入式进阶行者9 小时前
【算法】用三种解法解决字符串替换问题的实例:华为OD机考双机位A卷 - 密码解密
c++·算法·华为od