【问题标题】:What is the type of result? Is it possible?结果的类型是什么?可能吗?
【发布时间】:2019-05-29 20:05:43
【问题描述】:

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

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

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

我认为表达式结果的类型将是 unsigned int。我在 Stephen Pratt 的书中读到过。

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

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

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

【问题讨论】:

  • 除非INT_MAX 小于USHORT_MAX,否则表达式将是int 类型。因此,要拥有minimal reproducible example,您需要发布来自limits.h 的相关值。
  • 异或结果不能大于0xFFFF。谢谢。
  • 你是怎么知道的?
  • unsigned short 可以容纳的最大值不是0xFFFF,而是USHRT_MAX,其实现定义的值不小于65535。因此,该值可以更大。此外,INT_MAX 的值也是实现定义的,可能低至32767
  • 你问的是哪个表达式,a ^ b(a ^ b)(a ^ b) > 0,还是别的什么?

标签: c gcc types type-conversion


【解决方案1】:

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

  • 如果unsigned shortint 窄,则ab 分别转换为int(根据整数促销,C 2018 6.3.1.1 2,并且因为unsigned shortint 窄必然意味着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)。

【讨论】:

    【解决方案2】:

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

    (来自 cmets:)

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-22
      • 2012-10-19
      • 2013-10-30
      • 2014-03-21
      • 2017-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多