为什么无符号整数变量通常不受整数提升的影响?

时间:2014-09-02 20:05:58

标签: c promotions

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

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

由于int可以代表值15而没有任何问题(在我所知的所有平台上),它应该转换为int。

Integer promotions

  

无论是int还是unsigned,都可以在表达式中使用以下内容   可以使用int:

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

  2.   
  3. _Bool,int,signed int或unsigned int类型的位字段。

  4.         

    如果int可以表示原始类型的所有值(限制为   通过宽度,对于位字段),该值被转换为int;   否则,它将转换为unsigned int。这些被称为   整数促销。所有其他类型的整数不变   促销。

2 个答案:

答案 0 :(得分:8)

  

但是,我想知道为什么i的unsigned int变量。即价值15也不应该提升为int。 [...] int可以代表值15而没有任何问题

此声明存在两个问题:

  • 整数促销表示“促销为int”;它表示“促销为intunsigned int”。因此,“推广”unsigned int没有意义:它已被提升。
  • 整数提升规则不考虑表达式的当前值。这些规则专门用于讨论类型的所有值。因此,int能够表示值15的事实无关紧要,因为int无法表示unsigned int的所有值。

答案 1 :(得分:3)

通常情况下,在编译时无法说明实际发生促销时变量会保留哪些值。

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

我认为首选的无符号类型优于signed的主要原因是定义了无符号整数溢出,而有符号整数的溢出是未定义的行为。