C语言 结果的类型是什么?可能吗?



我尝试搜索问题的答案... 在C语言中,这种表达的类型是什么?

unsigned short a, b;
a = 0x1;
b = 0x2;
if((a ^ b) > 0) //This expression... 
...

我知道这不是可能导致错误的完全正确的代码。我应该使用 != 而不是>。

我认为表达式结果的类型将是无符号的 int。我在斯蒂芬·普拉特(Stephen Pratt)的书中读到过它。

如果我们有两种类型,那么涉及这些类型的表达式的结果必须是高级类型。(整数或无符号整数)

如果这两个变量有任何其他值,是否可以此表达式小于零? (如果我们在数字中设置最高有效位,它将变为负数,前提是它具有有符号数据类型)

我认为这是不可能的,但我可能是错的。 我做了猜测,但我想知道我的问题的正确答案。

(a ^ b) > 0中,其中abunsigned short

  • 如果unsigned short窄于int,则ab分别转换为int(根据整数提升,C 2018 6.3.1.1 2,并且因为unsigned short窄于int必然意味着int可以表示unsigned short的所有值)。
  • 否则,ab将转换为unsigned int(同上)。
  • 对于a ^ b,执行通常的算术转换(6.5.11)。在此表达式中,通常的算术转换不会更改类型 (6.3.1.8 1)。同样根据通常的算术转换,结果与转换后的操作数具有相同的类型。因此,如上所述,结果intunsigned int
  • (a ^ b)a ^ b(6.5.1 5) 具有相同的类型。
  • 对于(a ^ b) > 0,结果的类型为int(6.5.8 6)。

表达式a ^ b可能具有类型int,但如果有任何值可以表示为unsigned shorts,但不能表示为ints,则表达式将具有类型unsigned int。 对于一般a和类型unsigned shortb,其值不会超过USHRT_MAX,对于示例中的特定ab,其值将正好为 3。

(来自评论:)

我想知道 [(a^b)] 的结果是否可能是负数。 在这种情况下,表达式 ((a^b)> 0) 的结果将为假数

它永远不会计算为负数,因为无论通常的算术提升导致操作数转换为int还是unsigned int,结果值都将保持不变,因此非负数。 操作数的符号位(如果有)都不会设置,因此结果的符号位(如果有)也不会设置。

表达式(a ^ b) > 0的类型为int,对于给定的ab,它的计算结果为 1。 更一般地说,它对整数类型的ab的计算结果与a != b结果相同。 当然,这可以计算为0。 另一方面,对于无符号类型的ab,相关表达式(a ^ b) >= 0的计算结果始终为 1。

最新更新