我尝试搜索问题的答案... 在C语言中,这种表达的类型是什么?
unsigned short a, b;
a = 0x1;
b = 0x2;
if((a ^ b) > 0) //This expression...
...
我知道这不是可能导致错误的完全正确的代码。我应该使用 != 而不是>。
我认为表达式结果的类型将是无符号的 int。我在斯蒂芬·普拉特(Stephen Pratt)的书中读到过它。
如果我们有两种类型,那么涉及这些类型的表达式的结果必须是高级类型。(整数或无符号整数)
如果这两个变量有任何其他值,是否可以此表达式小于零? (如果我们在数字中设置最高有效位,它将变为负数,前提是它具有有符号数据类型)
我认为这是不可能的,但我可能是错的。 我做了猜测,但我想知道我的问题的正确答案。
在(a ^ b) > 0
中,其中a
和b
unsigned short
:
- 如果
unsigned short
窄于int
,则a
和b
分别转换为int
(根据整数提升,C 2018 6.3.1.1 2,并且因为unsigned short
窄于int
必然意味着int
可以表示unsigned short
的所有值)。 - 否则,
a
和b
将转换为unsigned int
(同上)。 - 对于
a ^ b
,执行通常的算术转换(6.5.11)。在此表达式中,通常的算术转换不会更改类型 (6.3.1.8 1)。同样根据通常的算术转换,结果与转换后的操作数具有相同的类型。因此,如上所述,结果int
或unsigned int
。 (a ^ b)
与a ^ b
(6.5.1 5) 具有相同的类型。- 对于
(a ^ b) > 0
,结果的类型为int
(6.5.8 6)。
表达式a ^ b
可能具有类型int
,但如果有任何值可以表示为unsigned short
s,但不能表示为int
s,则表达式将具有类型unsigned int
。 对于一般a
和类型unsigned short
的b
,其值不会超过USHRT_MAX
,对于示例中的特定a
和b
,其值将正好为 3。
(来自评论:)
我想知道 [
(a^b)
] 的结果是否可能是负数。 在这种情况下,表达式 ((a^b)> 0) 的结果将为假数
它永远不会计算为负数,因为无论通常的算术提升导致操作数转换为int
还是unsigned int
,结果值都将保持不变,因此非负数。 操作数的符号位(如果有)都不会设置,因此结果的符号位(如果有)也不会设置。
表达式(a ^ b) > 0
的类型为int
,对于给定的a
和b
,它的计算结果为 1。 更一般地说,它对整数类型的a
和b
的计算结果与a != b
结果相同。 当然,这可以计算为0。 另一方面,对于无符号类型的a
和b
,相关表达式(a ^ b) >= 0
的计算结果始终为 1。