试图解析C11标准中通常的算术转换规则

时间:2014-11-16 20:21:03

标签: c

我试图理解C11标准的算术转换规则。该标准指定了严格减少等级的不同整数类型:

long long int
long int
int
short int
char

此外,默认情况下,所有其他类型都是有符号签名的,而char则是有符号或无符号的,具体取决于实现。所有类型都有签名和未签名版本。 该标准还将实际类型定义为:

long double
double
float

我阅读标准的方式是,如果我们要添加例如。

a + b

a是实数类型,b是任何整数类型,然后b转换为a类型。换句话说,如果a的类型为floatb的类型为long long int,我们会先将b转换为float,然后执行另外,还是我读错了?换句话说,整数类型的等级是什么并不重要,它是指定整数类型转换为实际类型的实际类型。

最后,我遇到了这个问题。假设a未签名的等级高于签署的bb会发生什么?该标准表示我们将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位体系结构,因此有符号长整数不能容纳所有无符号整数。

我是否认为这是正确的,或者是否有某些部分我以错误的方式解释?

1 个答案:

答案 0 :(得分:2)

  

[...]和a是一个真实的类型,b是任何整数类型,然后b被转换为a的类型。换句话说,如果a的类型为floatb的类型为long long int,我们会先将b转换为float,然后执行另外[...]

  

最后,我遇到了这个问题。假设a未签名的等级高于签署的bb会发生什么?该标准表示我们将b转换为a的无符号版本。这是怎么做到的? [...]

转换b的(算术),添加/减去ULONG_MAX + 1,直到该值符合a的类型。< / p>

对于上一个示例,适用于C11(n1570)6.3.1.8 p1的最后一种情况,两个操作数都转换为与long int对应的无符号类型,即unsigned long int。 (我对此不太确定,但似乎标准(隐式?)要求所有有符号整数类型的相应无符号类型,包括扩展类型。)