目录

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

本文是转载文章,点击查看原文
如有侵权,请联系 xyy@jishuzhan.net 删除
相关推荐
疾跑哥布林升级版41 分钟前
C++---day7
开发语言·c++·算法
程序员老茶1 小时前
C++:函数
开发语言·c++
郭涤生1 小时前
Chapter 7: Compiling C++ Sources with CMake_《Modern CMake for C++》_Notes
c++·笔记·软件构建
fakerth2 小时前
计算机面试八股(自整)
c++·面试
双叶8362 小时前
(51单片机)矩阵按键密码锁表白(C语言代码编撰)(矩阵按键教程)(LCD1602浅教程)
c语言·开发语言·c++·算法·游戏·矩阵·51单片机
海棠蚀omo2 小时前
C++笔记-string(下)
开发语言·c++·笔记
天堂的恶魔9463 小时前
C++ —— 文件操作(流式操作)
c++
dora4 小时前
逼格提起来,使用curl发送网络请求
android·c++
yy_xzz4 小时前
基于条码数据生成校验密码的C++实现方案
开发语言·c++
技术小白Byteman4 小时前
蓝桥刷题note13(排序)
开发语言·数据结构·c++·学习·算法·visualstudio