C++:标准转换

本文详细介绍了C++中的标准转换,包括整型提升、整型转换、浮点转换、算术转换、指针转换、引用转换和指向成员的指针转换。其中,整型提升保证值的保留,而无符号转换到有符号类型可能产生不可预期的结果。此外,指针转换涉及到指向类、函数、void以及const和volatile类型的转换规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

C++ 语言定义其基础类型之间的转换。 它还定义指针、引用和指向成员的指针派生类型的转换。 这些转换称为 标准转换。

本节讨论下列标准转换:

整型提升

整型转换

浮点转换

浮点转换和整型转换

算术转换

指针转换

引用转换

指向成员的指针转换

备注

用户定义的类型可指定其自己的转换。 构造函数和转换中介绍了用户定义类型的转换。

以下代码将导致转换(本例中为整型提升):

long  long_num1, long_num2;
int   int_num;

// int_num promoted to type long prior to assignment.
long_num1 = int_num;

// int_num promoted to type long prior to multiplication.
long_num2 = int_num * long_num2;

仅当转换生成引用类型时,其结果才为左值。 例如,声明为的用户定义的转换 operator int&() 返回引用,并且是左值。 但是,声明为的转换将 operator int() 返回对象,而不是左值。

整型提升

整数类型的对象可以转换为另一个更宽的整型类型,即可以表示较大值集的类型。 这种扩大类型的转换被称为 整型提升。 使用整型提升时,可以在表达式中使用以下类型,只要可以使用其他整型类型:

类型为和的对象、文本和常量 char****short int

枚举类型

int 位域

枚举器

C + + 升级是 “保留值”,因为保证升级后的值与提升前的值相同。 在值保留提升的情况下, char int 如果 int 可以表示原始类型的完整范围,则较短整型类型的对象 (如位域或) 类型的对象。 如果 int 无法表示值的完整范围,则将对象提升为类型 unsigned int 。 尽管此策略与标准 C 所使用的策略相同,但值保留转换不保留对象的 “符号”。

值保留提升和保留符号的提升通常会生成相同的结果。 但是,如果升级的对象显示为,它们可能会产生不同的结果:

、、、 / % /= %= 、 < 、、 <= > 或的操作数 >=

这些运算符依赖于用于确定结果的符号。 当应用于这些操作数时,值保留和签署保存会产生不同的结果。

或的左操作数 >>``>>=

在移位操作中,这些运算符会以不同的方式处理签名和未签名的数量。 对于有符号数量,右移操作会将符号位传播到空出的位位置,而空出的位位置则以无符号的数量填充。

重载函数的参数或重载运算符的操作数,它依赖于参数匹配的操作数类型的符号。

整型转换

整型转换 是整型之间的转换。 整数类型为 char 、 short (或 short int) 、、 int long 和 long long 。 这些类型可以用或进行 signed 限定 unsigned ,并 unsigned 可用作的简写形式 unsigned int 。

有符号转换为无符号

有符号整数类型的对象可以转换为对应的无符号类型。 发生这些转换时,实际的位模式不会更改。 但是,数据的解释会发生变化。 考虑此代码:

#include <iostream>

using namespace std;
int main()
{
   
    short  i = -3;
    unsigned short u;

    cout << 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值