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