结果是什么类型?有可能吗?

时间:2019-05-29 20:05:44

标签: c gcc types type-conversion

我尝试搜索问题的答案... 用C语言表示的表达式是什么类型?

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

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

我认为表达式结果的类型将是unsigned int。我在史蒂芬·普拉特(Stephen Pratt)的书中读到了这本书。

如果我们有两种类型,则涉及这些类型的表达式的结果必须是上级类型。 (int或unsigned int)

如果这两个变量还有其他值,难道这个表达式将小于零? (如果我们将数字中的最高有效位设置为负,只要它具有带符号的数据类型,它将变为负数)

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

2 个答案:

答案 0 :(得分:2)

(a ^ b) > 0中,abunsigned short

  • 如果unsigned short的宽度小于int,则{<1>}和a分别转换为b(根据整数促销 ,C 2018 6.3.1.1 2,并且因为int窄于unsigned short必然意味着int可以代表int的所有值。)
  • 否则,unsigned shorta会转换为b ibid )。
  • 对于unsigned int,执行通常的算术转换(6.5.11)。在此表达式中,常规算术转换不会更改类型(6.3.1.8 1)。同样按照常规的算术转换,结果的类型与转换后的操作数相同。因此,结果是如上所述的a ^ bint
  • 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的类型为intUSHRT_MAX个。对于类型a的常规bunsigned short,其值将不超过a,对于特定的b(a^b),其值将恰好为3。在示例中。

(来自评论:)

  

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

它永远不会求出负数,因为通常的算术提升会导致操作数转换为unsigned int还是转换为(a ^ b) > 0,结果值将保持不变,因此为非负数。任何操作数的符号位(如果有的话)都不会被设置,因此结果的符号位(如果有的话)也将不会被设置。

表达式int的类型为a,对于给定的ba != b,表达式的值为1。更一般而言,对于整数类型的ab,它得出的结果与(a ^ b) >= 0相同。当然,该可以求值为0。另一方面,对于无符号类型的ab,相关表达式yarn add webpack-jquery-ui总是取值为1。