C++ 表达式中的类型转换

本文介绍了C++中表达式中的类型转换,包括自动转换和强制类型转换。自动转换涉及整形提升,编译器会根据特定规则进行类型提升以确保计算的正确性。而强制类型转换则可以通过显式转换函数或类型casts来实现。文章以实例说明了不同类型转换的用法,对于理解和避免溢出问题具有指导意义。
摘要由CSDN通过智能技术生成

C++ 表达式中的类型转换

简介

最近刷题经常遇到对结果取模,由于某些操作导致溢出。例如 MOD = 10e9 + 7

下列表达式

int hash = (base * base) % MOD // base * base  溢出

需要在表达式中加入强制类型转换。摘抄C++ Primer Plus 3.4.4 类型转换章节之表达式中的转换。

自动转换

整形提升(integral promotion): C++ 在计算表达式时,自动将 bool char unsigned char singed char short 转换为int。 例如true->1。由于int 是计算机最自然的类型,计算速度可能最快。

在表达式中,编译器通过按顺序查表进行转换:

  1. 如果一个操作数类型是 long double,将另一个操作数转换为long double
  2. 否则,如果一个操作数是double,将另一个操作数转换为double
  3. 否则,如果一个操作数是float,将另一个操作数转换为float
  4. 否则,说明操作数都是整型,执行整型提升
  5. 两个操作数均为有符号整型或者均为无符号整型,将级别低的转换成级别高的类型
  6. 如果两个操作数其中一个有符号整型另外一个无符号整型,且无符号整型级别比有符号操作数级别高,将有符号操作数转换为无符号操作数所属的类型
  7. 否则,如果有符号类型可表示无符号类型的所有可能取值,将无符号操作数转换为有符号操作数所属的类型
  8. 否则,将两个操作数都转换为有符号类型的无符号版本。

例如:对于 char + unsigned int 或者unsigned char + char ,执行4

对于6例如 unsigned long long + int 代码如下

#include <iostream>
#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值