在阅读了关于整数提升的相关问题之后,似乎是整数提升的常见理解或仅适用于小整数类型,例如short int
或char
。
但是,我想知道为什么i的unsigned int
变量。即价值15
也不应该提升为int
。毕竟,它的转换等级等于int和unsigned int的等级,如下面引用中的声明(1)所要求的那样。
由于int
可以代表值15
而没有任何问题(在我所知的所有平台上),它应该转换为int。
无论是int还是unsigned,都可以在表达式中使用以下内容 可以使用int:
具有整数转换等级小于或等于的整数类型的对象或表达式 int和unsigned int的等级。
- 醇>
_Bool,int,signed int或unsigned int类型的位字段。
如果int可以表示原始类型的所有值(限制为 通过宽度,对于位字段),该值被转换为int; 否则,它将转换为unsigned int。这些被称为 整数促销。所有其他类型的整数不变 促销。
答案 0 :(得分:8)
但是,我想知道为什么i的unsigned int变量。即价值
15
也不应该提升为int
。 [...]int
可以代表值15
而没有任何问题
此声明存在两个问题:
int
”;它表示“促销为int
或unsigned int
”。因此,“推广”unsigned int
没有意义:它已被提升。int
能够表示值15
的事实无关紧要,因为int
无法表示unsigned int
的所有值。答案 1 :(得分:3)
通常情况下,在编译时无法说明实际发生促销时变量会保留哪些值。
调查变量值以在运行时选择合适的类型会引入太多开销,而且根本不可能。因此,只有编译器才有类型。
我认为首选的无符号类型优于signed的主要原因是定义了无符号整数溢出,而有符号整数的溢出是未定义的行为。