C 为什么无符号整数变量通常不受整数提升的影响?
在阅读了大量关于整数提升的问题后,似乎大家都认为整数提升或仅适用于小整数类型,例如C 为什么无符号整数变量通常不受整数提升的影响?,c,promotions,C,Promotions,在阅读了大量关于整数提升的问题后,似乎大家都认为整数提升或仅适用于小整数类型,例如short int或char 然而,我想知道为什么I的无符号int变量。E值15也不应提升为int。毕竟,它的转换秩等于int和unsigned int的秩,正如下面引用的语句(1)所要求的那样 由于int可以毫无问题地表示15的值(在我所知道的所有平台上),因此应该将其转换为int 在表达式中使用int或unsigned时,可以使用以下内容 int可用于: 具有整数类型且其整数转换秩小于或等于的对象或表达式 整
short int
或char
然而,我想知道为什么I的无符号int
变量。E值15
也不应提升为int
。毕竟,它的转换秩等于int和unsigned int的秩,正如下面引用的语句(1)所要求的那样
由于int
可以毫无问题地表示15
的值(在我所知道的所有平台上),因此应该将其转换为int
在表达式中使用int或unsigned时,可以使用以下内容
int可用于:
15
也不应提升为int
。[…]一个int
可以毫无问题地表示15
的值
这种说法有两个问题:
- 整数升级并不意味着“升级到
”;它的意思是“升级到int
或int
”。因此,“提升”一个无符号int
没有意义:它已经被提升了无符号int
- 整数提升规则不考虑表达式的当前值。这些规则是以一种特定的方式编写的,用于讨论某一类型的所有值。因此,
能够表示值int
的事实是不相关的,因为15
不能表示int
的所有值无符号int
我认为选择无符号类型而不是有符号类型的主要原因是定义了无符号整数溢出,而有符号整数的溢出是未定义的行为。With
unsigned a=1;长b=2;b=a+b代码>,a
在添加之前被提升为long
。我不清楚你在问什么,你是在问一个理由,还是在问为什么措辞不允许这样做?这可能与你的问题有关:这是否会对你有所帮助?我还不确定我是否应该将此标记为可接受的答案。虽然第二条在我所知道的所有平台上都是绝对正确的,但第一条对我来说还不令人满意。我同意你的观点,“提升”一个无符号int
是没有意义的。然而,我发布这个问题的原因是:为什么法律允许将unsigned int
升级为int
,尽管这没有意义?毕竟,该标准规定:其整数转换秩小于或等于int和unsigned int的秩!我希望你明白我的意思。我不是母语人士,这是一个相当复杂的话题。@Multisync“为什么法律上允许将无符号int
提升为int
,尽管这没有意义?”法律上不允许:规则说“如果int
可以表示原始类型的所有值,则该值将转换为int
”。由于int
可以表示unsigned int
的部分(但不是全部)值,因此不考虑此提升,尽管类型具有相同的转换等级(实际上,所有对应的X
(有符号)和无符号X
类型总是有相同的转换等级)。嗯……好吧。我还是不明白他们为什么把“或”放在相等的位置“好了。如果我对秩模式的理解是正确的,那么就不可能有一个秩等于无符号int
或int
的类型,所以把它放进去没有任何意义。