IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> cpp 类型转换 -> 正文阅读

[C++知识库]cpp 类型转换

????????cpp 丰富的类型允许根据不同的需求选择不同的类型,这也使计算机的操作更复杂。例如,将两个short值相加涉及到的硬件编译指令可能会与将两个long值相加不同。由于有11中整型和3种浮点类型,因此计算机需要处理大量不同的情况,尤其是对不同的类型进行运算时,为处理这种潜在的混乱,cpp自动执行很多类型转换:

将一种算术类型的值赋给另一种算术类型的变量时,cpp将对值进行转换;

表达式中包含不同的类型时,cpp将对值进行转换;

将参数传递给函数时,cpp将对值进行转换;

1.初始化和赋值进行的转换

????????cpp允许将一种类型的值赋给另一种类型的变量。这样做时,值将被转换为接受变量的类型。将一个值赋给值取值范围更大的类型通常不会导致什么问题。例如,将short值赋给long变量并不会改变这个值,只是占用的字节更多而已。然而,将一个很大的long值赋给float变量将降低精度。因为float只有6位有效数字,因此会有一些潜在的问题。

将较大的浮点类型转换为较小的浮点类型,如将double转换为float,精度(有效数位)降低,值可能超出目标类型的取值范围,在这种情况下,结果将是不确定的。

将浮点类型转换为整型,小数部分丢失,原来的值可能超出目标类型的取值范围,在这种情况下,结果将是不确定的。

将较大的整型转换为较小的整型,如将long转换为short,原来的值可能超出目标类型的取值范围,通常只复制右边的字节。

将0赋给bool变量时,将被转换为false;而非零值将被转换为true。

将浮点值赋给整型将导致两个问题,首先,将浮点值转换为整型会将数字截断(除掉小数部分)。其次,float值对于int变量来说可能太大了。在这种情况下,cpp并没有定义结果应该是什么,这意味着不同的实现的反应可能不同。

2.以{ }方式初始化进行的转换

????????cpp11将使用大括号的初始化成为列表初始化,因为这种初始化常用语给复杂的数据类型提供值列表。它对类型转换的要求更加严格。具体来说,列表初始化不允许缩窄,即变量的类型可能无法表示赋给它的值。例如,不允许将浮点型转换为整数。在不同的整型之间转换或将整型转换为浮点型可能被允许,条件是编译器知道目标变量能够正确的存储赋给它的值。例如,可将long变量初始化为int值,因为long总是至少与int一样长,相反方向的转换也可能被允许,只要int变量能够存储赋给它的long常量。

const int code=66;
int x=66;
char c1{31325};
char c2={66};
char c3 {code};
char c4={x};
x=31325;
char c5=x;

3.表达式中的转换??

????????当一个表达式中包含两种不同的算术类型时,将出现什么情况呢?在这种情况下,cpp将执行两种自动转换:首先,一些类型在出现时便会自动转换;其次,有些类型在与其他类型同时出现在表达式中时将被转换。

在计算表达式时,cpp将bool,char,unsigned char,signed char和short值转换为int。具体的说,true被转换为1,false被转换为0.这些转换被称为整型提升。

将不同类型进行算术运算时,也会进行一些转换,例如将int和float相加时。当运算涉及两种类型时,较小的类型将被转换为较大的类型。例如,9.0除以5,由于9.0的类型为double,因此程序在用5除之前,将5转换为double类型。总之,编译器通过校验表来确定在算术表达式中执行的转换,校验表如下:

1).如果有一个操作数的类型是long double,则将另一个操作数转换为long double。

2).否则,如果有一个操作数的类型是double,则将另一个操作数转换为double。

3).否则,如果有一个操作数的类型是float,则将另一个操作数转换为float。

4).否则,说明操作数都是整型,因此执行整型提升。

5).在这种情况下,如果两个操作数都是有符号或无符号的,且其中一个操作数的级别比另一个低,则转换为类别高的类型。

6).如果一个操作数为有符号的,另一个操作数为无符号的,且无符号操作数的级别比有符号操作数高,则将由符号操作数转换为无符号操作数所属的类型。

7).否则,如果有符号类型可表示为无符号类型的所有可能取值,则将无符号操作数转换为有符号操作数所属的类型。

8).否则,将两个操作数都转换为有符号类型的无符号版本。

4.传递参数时的转换

传递参数时的类型转换通常由c++函数原型控制。

5.强制类型转换

?cpp还允许通过类型转换机制显式地进行类型转换。

#include <iostream>
int main()
{
    using namespace std;
    int auks, bats, coots;

    // the following statement adds the values as double,
    // then converts the result to int
    auks = 19.99 + 11.99;

    // these statements add values as int
    bats = (int) 19.99 + (int) 11.99;   // old C syntax
    coots = int (19.99) + int (11.99);  // new C++ syntax
    cout << "auks = " << auks << ", bats = " << bats;
    cout << ", coots = " << coots << endl;

    char ch = 'Z';
    cout << "The code for " << ch << " is ";    // print as char
    cout << int(ch) << endl;                    // print as int
    cout << "Yes, the code is ";
    cout << static_cast<int>(ch) << endl;       // using static_cast
   // cin.get();
    return 0; 
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-02-28 15:10:05  更:2022-02-28 15:10:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:48:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码