「C/C++ 01」类型转换与整型提升

目录

一、类型转换和截断问题

1. 隐式类型转换

2. 强制类型转换

3. 截断问题 

二、整型提升

0. 算数表达式的计算过程

1. 整型提升是什么?

2. 为什么要整型提升?

3. 如何进行整型提升

4. 唯一的注意事项

5. 通过在vs中的监视窗口来观察整型提升 

6. 整型提升会不会引发线程安全问题?  

7. 整型提升是隐式类型转换吗 


一、类型转换和截断问题

1. 隐式类型转换

隐式类型转换是指编译器算数、比较、赋值、传参、传返回值时,遇到与要求不符合类型时,编译器就会自动执行类型转换以使得操作数具有符合条件的类型。


C/C++中有以下四种情况会进行隐式转换:

  • 算数或比较时,低类型转换为高类型。
  • 赋值时,右边表达式的值自动隐式转换为左边变量的类型,并赋值。
  • 传参时,系统将实参转换为形参的类型后,赋给形参。
  • 传返回值时,系统将返回值的类型转换为返回值类型。

隐式类型转换的例子包括:

算数或比较时:

  • 整型提升:小于intunsigned int的整数类型(如charshort)在表达式中会自动提升为intunsigned int

  • 浮点提升:当float类型的值和double类型的值进行算术运算时,float值会被提升为double类型。

赋值、传参、传返回值时:

  • 赋值时,右边表达式的值自动隐式转换为左边变量的类型,并赋值。
  • 传参时,系统将实参转换为形参的类型后,赋给形参。
  • 传返回值时,系统将返回值的类型转换为返回值类型。
  • 上面三种情况都可能因为大类型转换为小类型,导致截断问题

2. 强制类型转换

        如果想把一个变量A的值强制放到另外一种类型的变量B中,我们就需要在A前面加上(B的类型)来完成强制类型转换,如:

int *A;
double *B = (double *)A;

但使用强转时一定要小心大类型转换为小类型,导致截断问题

无论是哪种类型转换,都是借助了一个临时变量,被转换的变量没有发生变化。

3. 截断问题 

        类型转换(无论是隐式还是显式)都可能导致数据截断问题,特别是在将较大类型的值转换为较小类型时。当源类型的表示范围大于目标类型时,如果源类型的值超出了目标类型的表示范围,或者源类型的精度高于目标类型,就会发生数据截断。这里的截断要考虑到数据类型的大小(占几个字节)和数值的二进制。

二、整型提升

0. 算数表达式的计算过程

  • 值的取出:
           变量在表达式中参与计算时,其变量中保存的值会被编译器取出然后保存到寄存器中。
  • 整型提升:
            在上诉过程中从各种短整型(如 char、short、unsigned short等)中取出的值会被编译器提升成 int 或 unsigned int型【如果表达式中有 unsigned int 或 size_t型变量,表达式中所有变量的值就被提升为unsigned int型;没有就被提升为int型】
  • 结果的存储:
            ​​​​​​​​​​​​​​运算结果被放在一个int或unsigned int型的临时变量中
  • 赋值给变量:
            ​​​​​​​​​​​​​​然后将这个int或unsigned int型的临时变量赋值给接收结果的变量(看情况发生隐式类型转换或截断)。

1. 整型提升是什么?

        整型提升是隐式类型转换的一种特殊情况,它发生在整型变量的算术运算或比较运算中,将整型变量中的值取出到用于计算或比较的寄存器时,对取出的数值的二进制位进行补0或补1的操作,使其变为4byte(32bit)的int 或 unsigned int 类型。


总结下来就是:

  • 执行表达式比较大小时,各种短整型(如 char、short....等)要提升为int 或 unsigned int 类型;
  • 如果表达式中存在unsigned int 或 size_t类型变量,那 短整型和int 就要提升为unsigned int类型
  • 如果只存在短整型和int,那 短整型 就要提升为int类型。

2. 为什么要整型提升?

        表达式的整型运算是由CPU的整型运算器(ALU)来完成的,CPU内整型运算器的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。

3. 如何进行整型提升

  • 整形提升为unsigned int:在高位补0 ,直到补满32bit。
  • 整形提升为int:在高位补符号位(整数补0,负数补-1),直到补满32bit。

4. 唯一的注意事项

        唯一一点要注意的是-1被整型提升为unsigned int类型时会变成42亿9千多万。其中的原理相信学过位运算后都能明白。

5. 通过在vs中的监视窗口来观察整型提升 

我们可以通过在vs中的监视窗口来观察整型提升:

  • 如果只存在短整型和int,那 短整型 就要提升为int类型:

  • 如果表达式中存在unsigned int 或 size_t类型变量,那 短整型和int 就要提升为unsigned int类型:

6. 整型提升会不会引发线程安全问题?  

        不会,整型提升不是对变量进行强制类型转换,而是将变量中的值取出到用于计算或比较的寄存器时,对取出的数值的二进制位进行补0或补1的操作,使其变为4bit。

7. 整型提升是隐式类型转换吗 

        是的,C++中的整型提升是一种隐式类型转换(Implicit Type Conversion)。隐式类型转换是编译器自动进行的类型转换,不需要程序员显式指定,也不会对原变量造成影响,整型提升是隐式类型转换的一种特殊情况,它发生在整型变量的算术运算或比较运算中


------------------------END-------------------------

才疏学浅,谬误难免,欢迎各位批评指正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/660299.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PotatoPie 4.0 实验教程(36) —— FPGA实现摄像头图像二值化开运算效果

手机扫码 链接直达 https://item.taobao.com/item.htm?ftt&id776516984361 什么是图像开运算,有什么作用? 图像开运算是数学形态学中的一种图像处理操作,它由两个基本操作组成:腐蚀(Erosion)和膨胀…

73、栈-柱状图中最大的矩形

思路: 矩形面积:宽度*高度 高度如何确定呢?就是在宽度中最矮的元素。如何确定宽度,就是要确定左右边界。 当我们在处理直方图最大矩形面积问题时,遇到一个比栈顶柱子矮的新柱子时开始计算面积的原因关键在于如何确定…

opencv基础篇 ——(十)非真实感渲染

非真实感渲染(Non-Photorealistic Rendering, NPR)是指通过一系列图像处理技术,将真实感图像转换为具有特定艺术风格或视觉效果的图像,模拟绘画、素描、卡通等非现实主义表现手法。OpenCV 提供了一些内置函数来实现非真实感渲染&a…

74、堆-数组中的第K个最大元素

思路&#xff1a; 直接排序是可以的&#xff0c;但是时间复杂度不符合。可以使用优先队列&#xff0c;代码如下&#xff1a; class Solution {public int findKthLargest(int[] nums, int k) {if (numsnull||nums.length0||k<0||k>nums.length){return Integer.MAX_VAL…

全域团购外卖SAAS系统是什么?

随着多家互联网平台的团购外卖板块逐渐稳定&#xff0c;不少人不再满足于只做1~2个平台的团购外卖服务商&#xff0c;想要拓宽业务范围。在此背景下&#xff0c;全域团购外卖SAAS应运而生&#xff0c;进一步推动了全域团购外卖的流行。 而所谓全域团购外卖&#xff0c;就是指所…

Android Perfetto 监控应用启动耗时

Perfetto 是一个 Google 开发的用于安卓系统性能监控和调试的工具&#xff0c;它旨在提供实时数据收集和可视化功能&#xff0c;帮助我们分析和优化应用程序的性能表现。Perfetto 可以捕获系统事件、CPU、内存、网络、GPU 等性能指标数据&#xff0c;并将其记录为轻量级的 Trac…

链表刷题集

文章目录 概要反转链表代码Python代码C 环形链表代码Python代码Java 小结 概要 这个主要记录下刷的一些题。 链表已经看过了&#xff0c;之前写了篇链表的文章&#xff0c;这一篇&#xff0c;写点跟链表有关的题。主要是leetcode上的。目的是熟悉下代码&#xff0c;代码这东西…

2024 JAVA Tinypng压缩图片,超级简单!!!

一、打开官网&#xff0c;注册账号&#xff0c;获取秘钥&#xff08;每个月500张免费&#xff09; 1.打开官网&#xff0c;注册账号 TinyPNG – Compress WebP, PNG and JPEG images intelligently 2.登录后&#xff0c;点击账号名字&#xff0c;找到如图所示 3.找到API&…

当众演讲技巧的方法有哪些(3篇)

当众演讲技巧的方法有哪些&#xff08;3篇&#xff09; 当众演讲技巧的方法有很多&#xff0c;下面我将分三篇来详细阐述其中的一些关键技巧&#xff1a; **篇&#xff1a;准备与开场技巧 充分准备&#xff1a;提前规划演讲内容&#xff0c;明确主题和目标&#xff0c;准备详…

螺旋角和导程、转位后的齿轮有什么关系?

最近和小伙伴聊到了一个问题&#xff1a;斜齿轮螺旋角和导程的关系&#xff0c;主要是在遇到在采用转位设计方式的刀具时&#xff0c;更觉得有点迷惑&#xff0c;今天咱们就聊聊这个事儿。 先来说斜齿轮螺旋角和导程的关系&#xff1a; 斜齿轮是有多个螺旋面组成的&#xff0…

解决RTC内核驱动的问题bm8563

常用pcf-8563 , 国产平替BM8563(驱动管脚一致)&#xff1b; 实时时钟是很常用的一个外设&#xff0c;通过实时时钟我们就可以知道年、月、日和时间等信息。 因此在需要记录时间的场合就需要实时时钟&#xff0c;可以使用专用的实时时钟芯片来完成此功能 RTC 设备驱动是一个标准…

【证明】快慢指针在带环链表中是否存在无法相遇的情形

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 目录 1. 前言2. 证明过程2.1 证明2.2 加证 3. 结论4. 结语 1. 前言 在了解本次内容前&#xff…