我认为 6.3.1.8
但是阅读:否则,新类型已签名且无法表示该值 在里面;结果是实现定义的还是 实现定义的信号被提出。
那里没有提到这种情况。那么只有6.3.1.3用于整数促销,当有铸造时,转换的顺序是什么。是促销,然后铸造或铸造然后促销或只是铸造。
答案 0 :(得分:2)
在许多情况下,C编译器将插入代码以将一种数据类型转换为另一种数据类型。其中包括由强制转换运算符执行的显式转换以及各种隐式转换。这两个转换上下文都包含在§6.3.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。