iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >浅谈C++类型转换几种情况
  • 680
分享到

浅谈C++类型转换几种情况

2024-04-02 19:04:59 680人浏览 安东尼
摘要

目录0. 类型转换的原理1. 初始化和赋值时进行的转换2. 以{}方式初始化时进行的转换(c++11新增)3. 表达式中的转换4. 传递参数时的转换5. 强制类型转换6. 使用aut

0. 类型转换的原理

在进行下面的学习前,我觉得有比较知道不同类型是怎么进行转换的。


int a = 777777; 
//二进制为00000000 01110110 10101101 11110001
short b = a;    
//b只有2字节,从低位开始截断,只能存10101101 11110001 注意,这并不是b的最终答案,
//我们应该知道,计算机中数值都是以二进制补码的形式存储的,所以我们需要将10101101 11110001还原为原码,
//也就是11011110 00110001,最高位是符号位,转换为十进制就是-8655
 cout << b;

在这里插入图片描述

而浮点数转整形,不但会进行上述过程还会进行小数截断。

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


 int int_a = 123;
 long long  int llong_a = int_a;
 //赋值的时候,编译器会先将int类型的123扩展为long类型123的新值,然后赋值给long_b,原先的int_a还是int类型,
 //没有变化。
 cout << "llong_b所占内存: " << sizeof(llong_a)<< "   值为:  " 
 << llong_a << "  int_a的类型:" << sizeof(int_a) << endl;
 //通常情况下,小范围转大范围这样赋值是没有问题,但是如果大范围转小范围可能回来带来一些麻烦,
 //如果大范围的数值在小范围之内,这也是没有问题的,如果该数值不在小范围之内会发生什么呢
 //long long int 最大值为9223372036854775807
 //而int的最大值为2147483647 我们来做个实验:
 long long int llong_b = 9223372036854775807;
 int int_b = llong_b;
 cout << "\nllong_b所占内存: " << sizeof(int_b) << "   值为:  " 
 << int_b << "  int_a的类型:" << sizeof(llong_b) << endl;
 //出现了问题,int_b的值只有-1,连自己本身类型的最大值都没有赋到。

运行结果:

在这里插入图片描述

小范围类型赋值给大范围类型是可以的,大范围赋值给小范围,要考虑好是否超出最大值,通常只会复制低位,建议不要这样做。

上面说的是整形类型的转换,如果是浮点数转换的话也会有两个问题:

1.将较大的浮点型转换为较小的浮点类型,精度降低(如果对精度不理解请看我的C++第一篇),值可能会超出目标类型的取值范围,这种情况下的值是不确定的。

2.将浮点型转换为整形,小数部分会被截断,原来的值可能超出目标类型的取值范围,这种情况下的值也是不确定的。

2. 以{}方式初始化时进行的转换(C++11新增)

用{}这种方式来转换类型是C++11新增的内容,它更为严格,不允许需要转换的类型进行缩窄,什么意思呢,就是要保证涉及到需要转换的类型应该是和需要完成的类型应该是一样长的,比如,int有4位,long long 有8位,long long想转为int,就必须将从左往右的4位截断,这就是缩窄。


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

代码的语法没有任何问题,但是编译运行时会出现:

在这里插入图片描述

第一个错误好理解一点,31325远远超过了char的最大范围。
第二个错误明明x的值为66,为什么会出错呢?编译器不会管你x的值是多大,他只管x的类型是多大。
而最后c5被赋予31325这个值,由于没有使用{}处理,并没有保存,但其结果是不确定的。
而浮点数转为整形,即使符合也不被允许:


 long long int a = {10.12f};
 long long int b = { 10.12 };

而整形转浮点数,只要符合缩窄条件,就可以被转换。

3. 表达式中的转换

下面是C++11版本的校验表,编译器将按照下表依次执行。

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

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

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

4.否则,说明操作数都是整形的,因此执行整形提升,什么是整形提升,下面有写。

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

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

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

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

整形提升:
如果bool,char、short,包括它们有符号或无符号变型,以及枚举类型,可以使用在需要int或者unsigned int的表达式中。如果int可以完整表示源类型的所有值,那么该源类型的值就转换为int,否则转换为unsigned int。这称为整型提升。

4. 传递参数时的转换

如果函数参数类型定义为double类型,但是传入的时int类型,这在C中会提示错误,但在C++中,C++会自动帮我我们转换为函数原型中定义的值,条件是两种都是算术类型。也可以手动取消这种自动,在这种情况下,C++将对char和short类型进行整形提升,将float转为double类型。

5. 强制类型转换

C++允许用户自己强制转换变量的类型,C++自己规定的类型转换规则有时候可能并不适合用户,并且被转的变量本身并没有有任何影响。


int a = 66;
(long)a;// 这种是C的风格
long(a);// 这种是C++的风格,应尽量使用这种。

6. 使用auto让编译器自己推断变量类型

C++新增的一个工具,让编译器能够根据初始值的类型推断变量的类型,像是js中的var,这个东西就是C语言中的关键字auto。


auto a = 666;//编译器将为a定义为int类型
auto b = 66.66f;//编译器将为b定义为float类型,注意数值后面的f

除了我上面写的,C++还引入了4个强制类型转换运算符,由于我还没有学到那里,就不写了,嘿嘿。

到此这篇关于浅谈C++类型转换几种情况的文章就介绍到这了,更多相关C++ 类型转换内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 浅谈C++类型转换几种情况

本文链接: https://www.lsjlt.com/news/131927.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 浅谈C++类型转换几种情况
    目录0. 类型转换的原理1. 初始化和赋值时进行的转换2. 以{}方式初始化时进行的转换(C++11新增)3. 表达式中的转换4. 传递参数时的转换5. 强制类型转换6. 使用aut...
    99+
    2024-04-02
  • 浅谈C++为什么非要引入那几种类型转换
    众所周知C++关于类型转换引入了四种方式: static_cast const_cast dynamic_cast reinterpret_cast  ...
    99+
    2024-04-02
  • 浅谈JavaScript中内存泄漏的几种情况
    目录一、内存泄漏是什么?二、垃圾回收机制1、标记清除2、引用计数三、常见的内存泄漏的情况1、意外的全局变量2、定时器造成的内存泄露3、闭包4、没有清理对DOM元素的引用5、事件监听(...
    99+
    2023-05-18
    JavaScript 内存泄漏
  • 浅谈mysql增加索引不生效的几种情况
    增加索引可以提高查询效率。 增加索引就是增加一个索引文件,存放的是数据的地址,类似与我们文档的目录,在查找过程中可以不用从书的内容查找,直接根据目录对应的页码查找。索引是根据地址查找...
    99+
    2024-04-02
  • 浅谈Redis阻塞的9种情况
    目录命令阻塞SAVE 阻塞同步持久化AOF 重写AOF 日志大 Key 问题查找大 key删除大 key清空数据库集群扩容前两天去美团面试的陈同学回来了,看他满脸泄气的样子,准是没拿到 Offer。 听了他面试的经过,真...
    99+
    2023-03-24
    Redis 阻塞
  • C++类型转换引入了那几种方式
    这期内容当中小编将会给大家带来有关C++类型转换引入了那几种方式,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。众所周知C++关于类型转换引入了四种方式:static_castconst_castdynam...
    99+
    2023-06-15
  • 浅谈C++11中的几种锁
    目录互斥锁(mutex)条件锁(condition_variable)自旋锁(不推荐使用)递归锁(recursive_mutex)互斥锁(mutex) 可以避免多个线程在某一时刻同时...
    99+
    2024-04-02
  • 浅谈C#中[]的几种用法
    目录一、导入外部DLL函数二、结构体时表明属性一、导入外部DLL函数 如[DllImport(“kernel32.dll”)]这叫引入kernel32.dll...
    99+
    2023-01-28
    C# []用法 C# []
  • C++的四种类型转换
    目录一、隐式类型转换和显示类型转换二、C++的四种类型转换2.1 static_cast 相似转化2.2 reinterpret_cast 不同类型转化2.3 const_cast ...
    99+
    2023-05-14
    C++实现类型转换方法 C++实现类型转换
  • 谈谈Golang停止运行的几种情况与处理方法
    Golang是一门非常流行的编程语言,被广泛应用于各种系统和领域中。在开发过程中,Golang的运行出现停止是比较常见的情况,而了解停止的原因和处理方法是我们开发人员必须掌握的技能之一。本文将探讨Golang停止运行的几种情况和处理方法。一...
    99+
    2023-05-14
  • C#强制类型转化有几种
    这篇文章给大家分享的是有关C#强制类型转化有几种的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。C#强制类型转化有以下三种:注:objA 为 typeA 类型,objB 为 typeB 类型(1) typeA ob...
    99+
    2023-06-18
  • C++为什么非要引入那几种类型转换
    这篇文章主要讲解了“C++为什么非要引入那几种类型转换”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++为什么非要引入那几种类型转换”吧!众所周知C++关于类型转换引入了四种方式:stat...
    99+
    2023-06-09
  • JavaScript中的类型转换有哪几种
    这篇文章主要讲解了“JavaScript中的类型转换有哪几种”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript中的类型转换有哪几种”吧! ...
    99+
    2024-04-02
  • 浅谈String类型如何转换为time类型存进数据库
    目录String转换为time存进数据库这里就列举一个例子java里面的类型是string类型我用的是java提供的传统的jdbc接口连接数据库String类型的数字转换为时间日期格...
    99+
    2024-04-02
  • 浅谈spring aop的五种通知类型
    spring aop通知(advice)分成五类: 前置通知[Before advice]:在连接点前面执行,前置通知不会影响连接点的执行,除非此处抛出异常。 正常返回通知[After returning advice]...
    99+
    2023-05-30
    spring aop 通知
  • C# 将PDF转为SVG的3种情况
    PDF格式的文档广泛用于各种办公场所,在工作中难免会有将PDF文档转换为其他文档格式的需要。在本篇文档中,将介绍PDF转为SVG的方法。根据不同的转换需求,这里分三种情况进行讲述,即转PDF所有页为SVG、转PDF指定页为SVG和转PDF到...
    99+
    2023-01-31
    情况 PDF SVG
  • 详解C++中四种类型的转换
    目录const_caststatic_castreinterpret_castdynamic_cast代码C语言中我们使用 int a=(int) b;的方式强制转换 C++提供了四...
    99+
    2022-12-08
    C++类型转换 C++ 类型转换符 C++ 转换符
  • 详谈JSON与Javabean转换的几种形式
    JSON格式的数据传递是最常用的方法之一,以下列出了常用的几种形态以及与Javabean之间的转换:String json1="{'name':'zhangsan','age':23,'interests':[{'interest':'篮球...
    99+
    2023-05-31
    javabean 转换 json
  • C++强制类型转换的四种方式
    目录1 C++类型转换本质1.1 自动类型转换(隐式)1.2 强制类型转换(显式)1.3 类型转换的本质1.4 类型转换的安全性2 四种类型转换运算符2.1 C语言的强制类型转换与C...
    99+
    2024-04-02
  • c#数据类型有哪几种
    c# 中提供了多种数据类型,用于存储不同类型的数据,包括原始类型(整数、浮点、字符、布尔)、引用类型(类、数组)和特殊类型(dynamic、object)。选择数据类型时应考虑数据范围、...
    99+
    2024-04-04
    c# 隐式转换
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作