首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >铸造与整数转换混淆

铸造与整数转换混淆
EN

Stack Overflow用户
提问于 2017-02-15 04:23:21
回答 1查看 157关注 0票数 0

我觉得标准的6.3.1.3已经包含在6.3.1.8中了

但阅读:

否则,将对新类型进行签名,并且不能在其中表示值;结果要么是实现定义的,要么引发实现定义的信号。

这里没有提到这个案子。因此,6.3.1.3只适用于整型升迁,当有铸造时,转换的顺序是什么。是升职,然后是铸造或铸造,然后是升职,还是仅仅是铸造。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-15 06:03:07

在许多情况下,C编译器将插入代码以将一种数据类型转换为另一种数据类型。这包括由cast操作符执行的显式转换,以及各种隐式转换。第6.3.1节涵盖了这两种转换情况:

  1. 几个运算符自动将操作数值从一种类型转换为另一种类型。这个子子句指定这种隐式转换所需的结果,以及转换操作(显式转换)所产生的结果。

§6.3.1.3解释了转换是如何执行的,而没有指定何时执行转换。相同的过程用于显式和隐式转换;要执行转换,只需要知道原始类型和所需类型。

§6.3.1.8解释了在某些常见情况下如何选择目标类型,而没有指定转换的算法。因此,这两个条款是完全互补的。一个描述转换是如何完成的,另一个描述转换是如何完成的。

§6.3.1.8适用于操作数必须相同的某些算术运算符。(如前所述,这个子句并不适用于所有算术运算符,您必须阅读每个操作符的说明才能看到异常。)应该注意的是,为两个操作数选择目标类型的算法只会导致“拓宽”转换。目标类型总是与原始类型一样宽或更宽。有符号整数可能会转换为相同宽度的无符号整数,但只有在有符号类型足够宽以表示无符号类型的所有值时,才会将无符号类型转换为有符号类型。

在第6.3.1.3p2节中,没有实现定义的行为精确地定义了签名到无符号转换的实现。因此,第6.3.1.3p3段将永远不适用于第6.3.1.8节所要求的转换。在§6.3.1.1p2中定义的整数提升也是如此,它可以由§6.3.1.8中描述的算法触发。

在进行自动或显式转换的其他情况下,可以请求缩小转换;如果对收缩转换的目标进行了签名,则可以应用第6.3.1.3p3节。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42240729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档