2

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

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

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

整数促销

可以在可以使用 int 或 unsigned int 的表达式中使用以下内容:

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

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

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

4

2 回答 2

8

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

这个说法有两个问题:

  • 整数促销并不意味着“促销到一个int”;它的意思是“提升到一个intunsigned int”。因此,“提升” anunsigned int没有意义:它已经被提升了。
  • 整数提升规则不考虑表达式的当前值。这些规则是专门以讨论一个类型的所有值的方式编写的。int因此,an能够表示值的事实15是无关紧要的,因为int它不能表示 的所有值unsigned int
于 2014-09-02T20:14:01.990 回答
3

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

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

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

于 2014-09-02T20:17:00.497 回答