前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C++类型转换

C++类型转换

作者头像
用户7272142
发布于 2023-10-11 13:16:00
发布于 2023-10-11 13:16:00
30200
代码可运行
举报
文章被收录于专栏:Republic博客Republic博客
运行总次数:0
代码可运行

因为需求不同我们可以选择不同的类型,我们在计算不同类型的数据时,需要用到类型转换。

将一种算数类型的值赋给另一种算数类型的变量时,C++++将进行转换

表达式中包含不同类型时

将参数传递给函数时 程序自己进行的转化叫自动转换,如果不理解这些转换,有些结果是无法理解的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
long l_long;
short s_short;
l_long = s_short;

我是win10 64位 所以short需要接受long的数据,则自身16位需要扩展为32位,会得到一个新值,而s_short的内容不变。将一个值赋值给取值范围更大的类型不会导致什么问题,例如把short的值赋值给long,并没有改变这个值,而是占用了更大的空间而已。如果将一个很大的值long赋值给float将会降低精度,因为只能最低保证六位有效位,所以会得到一个四舍五入的值。 转换存在的问题

转换

潜在的问题

double->float

数据有效位降低,结果不确定

float->int

小数部分丢失,结果不确定

long->short

原来的值可能超出目标类型,一般只复制右边的字节(低字节)

{}方式进行初始化转换

与上面的初始化相比,{}有更严格的转换要求。列表初始化不允许缩窄,即变量的类型可能无法表示赋给他的值;例如不允许将浮点型转换为整型。允许的条件是编译器知道目标变量可以存储赋给的值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<iostream>
using namespace std;
int main()
{
  const int code = 66;
  int x = 66;
  char c1{ 31325 };//超出范围
  char c2={ 66 };
  char c3{ code };
  char c4 = { x };
  x = 31325;
  char c5 = x;
}

c4初始化时,编译器并不会通过,因为在编译器看来,x是一个变量,他并不知道变量的大小,因此不可以转换。

表达式转换

当一个表达式出现两种不同的算数类型时,一些类型会出现时自当转换,其次,有些类型在与其他类型出现在表达式里面会被转换。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
short chicken = 20;
short ducks = 35;
short fowl = chicken+ducks;

转换过程为,先把chicken和ducks转换成int 然后相加结果再转换为short,因为int是计算机最自然的类型,如果short比int短,则unsigned类型将被转换为int 如果长度相等,则unsigned short类型被转换为unsigned int,确保了数据转换时,不会丢失数据。 不同数据类型尽心运算时候,也会进行一些转换,例如将int和float相加时,当涉及两种类型时,较小的类型会被转为较大的类型 VS2019的C++语言标准默认为C++14。 这里总结一下C++自动转换的规则

转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转成long型后再进行运算。也是小转大 a、若两种类型的字节数不同,转换成字节数高的类型 b、若两种类型的字节数相同,且一种有符号,一种无符号,则转换成无符号类型

char型和short型参与运算时,必须先转换成int型。

在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型

如果右边量的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度

强制转换

C语言转换(typename) value C++转换 typename (name) 强制类型转换不会改变转换变量本身,而是根据转换类型创建一个新的值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
char q = 'q';
cout<<(int)q

q将会输出q对应的ascii码 我们可以通过程序演示一下强制转换。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<iostream>
int main()
{
  using namespace std;
  int auks, bats, coots;
  auks = 19.99 + 11.99;
  bats = int(19.99) + int(11.99);
  coots = (int)19.99 + (int)11.99;

  cout << "auks = " << auks
      << "bats = " << bats
      << "coots = " << coots << endl;
  char ch = 'Z';
  cout << "the code for" << ch << "is";
  cout << int(ch) << endl;
  cout << "the code is ";
  cout << static_cast<int>(ch) << endl;
  return 0;
}

首先,将19.99和11.99相加,结果为31.98。这个值赋给int变量auks时,被截短为31。如果是强转的话,两个值分别被截短为19和11.同样的字符也是转为整数,打印存储在ch中的Ascii码。

auto

这个关键词可以让编译器根据初始值的类型推断变量的类型。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
auto n = 100;//int
auto x = 1.5;//double
auto y = 1.3e12L;//long double

但是这个关键词在创建基本简单情况时,会很容易出。auto x = 0;如果我们需要一个double 而编译器会认为他是一个int类型。

总结

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-09-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Pre-Training】Transformer-XL:比 Transformer 强一点
今天学习的是谷歌大脑的同学和 CMU 的同学于 2019 年联合出品的论文《Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context》,目前被引次数超 200 次。
阿泽 Crz
2020/07/21
7290
【综述专栏】Transformer的9种变体概览
在科学研究中,从方法论上来讲,都应“先见森林,再见树木”。当前,人工智能学术研究方兴未艾,技术迅猛发展,可谓万木争荣,日新月异。对于AI从业者来说,在广袤的知识森林中,系统梳理脉络,才能更好地把握趋势。为此,我们精选国内外优秀的综述文章,开辟“综述专栏”,敬请关注。
马上科普尚尚
2021/03/17
2.1K0
【综述专栏】Transformer的9种变体概览
【NLP】XLNet详解
BERT本身很有效,但它也存在一些问题,比如不能用于生成、以及训练数据和测试数据的不一致(Discrepancy)。在本文中,我们重点介绍比BERT更强大的预训练模型XLNet,它为了达到真正的双向学习,采用了Permutation语言模型、以及使用了双流自注意力机制,并结合了Transformer-XL的相对位置编码。
yuquanle
2020/03/13
1.4K0
中文NER的那些事儿5. Transformer相对位置编码&TENER代码实现
这一章我们主要关注transformer在序列标注任务上的应用,作为2017年后最热的模型结构之一,在序列标注任务上原生transformer的表现并不尽如人意,效果比bilstm还要差不少,这背后有
风雨中的小七
2021/11/19
1.3K0
谷歌升级版Transformer官方解读:更大、更强,解决长文本问题(开源)
这是一个长期依赖性(long-range dependence)的例子,这是序列数据中常见的现象,处理许多现实世界的任务都必须理解这种依赖。
新智元
2019/05/08
1.4K0
谷歌升级版Transformer官方解读:更大、更强,解决长文本问题(开源)
CMU和谷歌联手放出XL号Transformer!提速1800倍 | 代码+预训练模型+超参数
近日,CMU和谷歌联手发布一篇论文,介绍了一种新的语言建模方法Transformer-XL。
量子位
2019/04/24
6660
CMU和谷歌联手放出XL号Transformer!提速1800倍 | 代码+预训练模型+超参数
大语言模型中常用的旋转位置编码RoPE详解:为什么它比绝对或相对位置编码更好?
自 2017 年发表“ Attention Is All You Need ”论文以来,Transformer 架构一直是自然语言处理 (NLP) 领域的基石。它的设计多年来基本没有变化,随着旋转位置编码 (RoPE) 的引入,2022年标志着该领域的重大发展。
deephub
2024/04/01
7.4K0
大语言模型中常用的旋转位置编码RoPE详解:为什么它比绝对或相对位置编码更好?
[预训练语言模型专题] Transformer-XL 超长上下文注意力模型
5-8:[BERT来临]、[浅析BERT代码]、[ERNIE合集]、[MT-DNN(KD)]
朴素人工智能
2020/05/07
1K0
NLP预训练家族 | Transformer-XL及其进化XLNet
最近又重新读了Transformer-XL和XLNet的论文和代码,又有很多新的感悟。其中,要想搞懂XLNet的同学一定要首先明白Transofrmer-XL,因为XLNet是基于Transformer-XL进行改进的。
NewBeeNLP
2021/08/20
9110
​迁移学习在NLP中的演化:从基础到前沿
论文标题:Evolution of Transfer Learning in Natural Language Processing
AI科技评论
2019/10/31
9290
​迁移学习在NLP中的演化:从基础到前沿
Transformers Assemble(PART III)
第四篇也非常有趣提出将独立的词向量替换成自变量为位置的函数,引入了复数空间综合了词向量和位置向量」
NewBeeNLP
2020/08/26
6190
Transformers Assemble(PART III)
【Pre-Training】关于 Transformer 那些的你不知道的事
本博客 主要 是本人在学习 Transformer 时的「所遇、所思、所解」,通过以 「十六连弹」 的方式帮助大家更好的理解 该问题。
阿泽 Crz
2020/07/29
9160
【Pre-Training】关于 Transformer 那些的你不知道的事
中文NER的那些事儿5. Transformer相对位置编码&TENER代码实现
这一章我们主要关注transformer在序列标注任务上的应用,作为2017年后最热的模型结构之一,在序列标注任务上原生transformer的表现并不尽如人意,效果比bilstm还要差不少,这背后有
用户4268038
2021/11/18
5460
命名实体识别新SOTA:改进Transformer模型
TENER: Adapting Transformer Encoder for Name Entity Recognition
AI科技评论
2019/11/28
2.4K0
命名实体识别新SOTA:改进Transformer模型
CMU、谷歌提出Transformer-XL:学习超长上下文关系
语言建模需要对长期依赖性进行建模,它成功应用了无监督的预训练方法 (Peters et al., 2018; Devlin et al., 2018)。但要让神经网络对序列数据的长期依赖性建模一直都是一项挑战。
机器之心
2019/04/30
8870
CMU、谷歌提出Transformer-XL:学习超长上下文关系
【NLP】TransformerXL:因为XL,所以更牛
前面介绍过Transformer作为一种特征抽取器的强大之处。那么,它有没有弱点呢?能不能改进呢?
用户1508658
2019/08/16
1.2K0
【NLP】TransformerXL:因为XL,所以更牛
XLNet预训练模型,看这篇就够了!(代码实现)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
mantch
2019/09/30
7220
XLNet预训练模型,看这篇就够了!(代码实现)
后BERT时代:15个预训练模型对比分析与关键点探究
在小夕之前写过的《NLP的游戏规则从此改写?从word2vec, ELMo到BERT》一文中,介绍了从word2vec到ELMo再到BERT的发展路径。而在BERT出现之后的这大半年的时间里,模型预训练的方法又被Google、Facebook、微软、百度、OpenAI等极少数几个玩得起游戏的核心玩家反复迭代了若干版,一次次的刷新我们这些吃瓜群众的案板上的瓜。
zenRRan
2019/08/21
2.3K0
后BERT时代:15个预训练模型对比分析与关键点探究
追溯XLNet的前世今生:从Transformer到XLNet
正当 GPT-2 还拿着 15 亿参数的模型吊着人们的胃口时,XLNet 带着开源的代码和 20 项 SOTA 的成绩悄悄发布了。从 BERT 到 XLNet,大一统预训练模型的成功,无疑昭示着行业的快速进步。现在是最好的时机。回到正题,本文虽篇幅较长,但能提供不一样的视角,帮你迅速理清模型的细节。废话不多说,笔者这就将带你快速品读,XLNet 诞生之路上最重要的三篇论文:
AI科技大本营
2019/07/16
1.5K0
追溯XLNet的前世今生:从Transformer到XLNet
Transformer的一家!
而关于attention和self-attention存在非常多的形式,我们之前常见的Transformer是依赖于scaled-dot-product的形式,也就是:给定query矩阵Q, key矩阵K以及value矩阵V,那么我们的输出就是值向量的加权和,其中,分配给每个值槽的权重由Quey与相应Key的点积确定。
zenRRan
2021/03/01
8200
推荐阅读
相关推荐
【Pre-Training】Transformer-XL:比 Transformer 强一点
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验