【问题标题】:Why are unsigned integer variables generally not affected by integer promotions?为什么无符号整数变量通常不受整数提升的影响?
【发布时间】:2014-10-27 04:44:13
【问题描述】:

在阅读了相当多关于整数提升的问题后,似乎普遍的理解是整数提升或仅适用于小整数类型,例如short intchar

但是,我想知道为什么 i 的 unsigned int 变量。 e.值 15 也不应该提升为 int。毕竟,它的转换等级等于 int 和 unsigned int 的等级,正如下面引用中的语句 (1) 所要求的。

由于int 可以毫无问题地表示值15(在我知道的所有平台上),它应该被转换为int。

Integer promotions

以下内容可以用在表达式中,只要是 int 或 unsigned 可以使用 int:

  1. 具有整数类型的对象或表达式,其整数转换等级小于或等于 int 和 unsigned int 的等级。

  2. _Bool、int、signed int 或 unsigned int 类型的位域。

如果一个 int 可以表示原始类型的所有值(受限制 通过宽度,对于一个位域),该值被转换为一个 int; 否则,它将转换为无符号整数。这些被称为 整数促销。所有其他类型都不变整数 促销活动。

【问题讨论】:

标签: c promotions


【解决方案1】:

但是,我想知道为什么 i 的 unsigned int 变量。 e.值 15 也不应该提升为 int。 [...] int 可以毫无问题地代表值 15

这种说法有两个问题:

  • 整数提升意味着“提升到int”;它的意思是“升级到intunsigned int”。因此,“提升”unsigned int 没有意义:它已经被提升了。
  • 整数提升规则不考虑表达式的当前值。规则是专门以讨论类型的所有值的方式编写的。因此,int 能够表示值15 的事实是无关紧要的,因为int 不能表示unsigned int 的所有值。

【讨论】:

  • 我还不确定是否应该将此标记为已接受的答案。虽然第二个条款在我所知道的所有平台上都绝对正确,但第一个条款对我来说还不满意。我和你一样,“提升”unsigned int 没有意义。然而,我发布这个问题的原因是:为什么允许将unsigned int 升级为int 合法,尽管这没有意义?毕竟,标准说:其整数转换等级小于或等于到int和unsigned int的等级!我希望你明白我的意思。我不是母语人士,这是一个相当复杂的话题。
  • @Multisync "为什么在法律上允许将unsigned int 提升为int,尽管它没有意义?"这在法律上是不允许的:规则说“如果int 可以表示原始类型的所有值,则该值将转换为int”。由于int 可以表示unsigned int一些 值,但不能表示全部 值,因此尽管类型具有相同的转换等级(实际上,所有对应的X(有符号)和unsigned X类型总是具有相同的转换等级)。
  • 嗯……好吧。我仍然不明白他们为什么把“或等于”放在那里。如果我对等级模式的理解是正确的,那么就不可能有等级等于unsigned intint 的类型,所以放在那里没有任何意义。
【解决方案2】:

通常,在编译时不可能说当提升实际发生时变量将持有什么值。

在运行时调查变量的值以选择合适的类型会引入过多的开销,而且根本不可能。所以,编译器只有类型。

我认为喜欢无符号类型而不是有符号的主要原因是定义了无符号整数溢出,而有符号整数的溢出是未定义的行为。

【讨论】:

    猜你喜欢
    • 2022-01-20
    • 1970-01-01
    • 2017-07-01
    • 2019-12-21
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    • 2018-02-03
    相关资源
    最近更新 更多