我觉得标准的6.3.1.3已经包含在6.3.1.8中了
但阅读:
否则,将对新类型进行签名,并且不能在其中表示值;结果要么是实现定义的,要么引发实现定义的信号。
这里没有提到这个案子。因此,6.3.1.3只适用于整型升迁,当有铸造时,转换的顺序是什么。是升职,然后是铸造或铸造,然后是升职,还是仅仅是铸造。
发布于 2017-02-15 06:03:07
在许多情况下,C编译器将插入代码以将一种数据类型转换为另一种数据类型。这包括由cast操作符执行的显式转换,以及各种隐式转换。第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节。
https://stackoverflow.com/questions/42240729
复制相似问题