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

相关推荐
牛油果子哥q1 小时前
C++STL算法超全精讲:排序/查找/去重/遍历/最值/合并全套API、仿函数、Lambda适配、实战避坑
开发语言·c++·算法
Xeon_CC2 小时前
用C++编写屏幕准星
开发语言·c++
星恒随风3 小时前
C++ 哈希详解(二):开放定址、哈希桶与 C++ 哈希表底层实现
c++·笔记·学习·哈希算法·散列表
lingran__3 小时前
C++ STL unordered系列(哈希) 底层剖析与模拟实现万字详解 | 基于哈希表,复刻 SGI-STL 泛型哈希容器架构
开发语言·c++·后端·哈希算法·哈希表·泛型编程·unordered系列
鸿芯微控科技3 小时前
MFC设定流量达不到怎么办?上游供气能力、压差与管路阻力排查
c++·mfc·质量流量控制器·流量不足排查·压差测试·气体流量控制
郝学胜_神的一滴4 小时前
C++20 高级编程 003:吃透现代基础语法与标准容器
c++
码匠许师傅4 小时前
【C++ 面试真题】聊聊 C++ 的关联容器
开发语言·c++·面试
Hhy_11075 小时前
《C++深度解构02》类和对象(上)——定义规范、内存对齐与 this 指针全解
c语言·开发语言·c++·学习·visual studio
晚风叙码5 小时前
C++哈希表实现:开放定址法和链地址法 (哈希桶)
数据结构·c++·哈希算法·散列表
呜喵王阿尔萨斯5 小时前
C/C++ 杂记-1
c++