我试图理解C11标准的算术转换规则。该标准指定了严格减少等级的不同整数类型:
long long int
long int
int
short int
char
此外,默认情况下,所有其他类型都是有符号签名的,而char则是有符号或无符号的,具体取决于实现。所有类型都有签名和未签名版本。 该标准还将实际类型定义为:
long double
double
float
我阅读标准的方式是,如果我们要添加例如。
a + b
和a
是实数类型,b
是任何整数类型,然后b
转换为a
类型。换句话说,如果a
的类型为float
且b
的类型为long long int
,我们会先将b
转换为float
,然后执行另外,还是我读错了?换句话说,整数类型的等级是什么并不重要,它是指定整数类型转换为实际类型的实际类型。
最后,我遇到了这个问题。假设a
未签名的等级高于签署的b
,b
会发生什么?该标准表示我们将b
转换为a
的无符号版本。这是怎么做到的?我看到了这种转换的两个逻辑选项。假设a
是无符号长整数,b
是有符号整数,那么我们可以这样做:
signed int -> unsigned int -> unsigned long
signed int -> signed long -> unsigned long
这些可能产生不同的值,因为在第一种情况下我们将UINT_MAX + 1添加到b
,而在第二种情况下,如果b
为负,则将ULONG_MAX + 1添加到b
。 / p>
最后,如果说a
的签名类型的排名高于b
,会发生什么,但b
的值范围不适合a
?这似乎是该标准所指的最后一种可能情况?我认为这是你得到的,例如当int和long具有相同大小的表示时,32位体系结构,因此有符号长整数不能容纳所有无符号整数。
我是否认为这是正确的,或者是否有某些部分我以错误的方式解释?
答案 0 :(得分:2)
[...]和
a
是一个真实的类型,b
是任何整数类型,然后b被转换为a
的类型。换句话说,如果a
的类型为float
且b
的类型为long long int
,我们会先将b
转换为float
,然后执行另外[...]
是
最后,我遇到了这个问题。假设
a
未签名的等级高于签署的b
,b
会发生什么?该标准表示我们将b
转换为a
的无符号版本。这是怎么做到的? [...]
转换b
的(算术)值,添加/减去ULONG_MAX
+ 1,直到该值符合a
的类型。< / p>
对于上一个示例,适用于C11(n1570)6.3.1.8 p1的最后一种情况,两个操作数都转换为与long int
对应的无符号类型,即unsigned long int
。 (我对此不太确定,但似乎标准(隐式?)要求所有有符号整数类型的相应无符号类型,包括扩展类型。)