假设以下情况:
unsigned char foo = 3;
unsigned char bar = 5;
unsigned int shmoo = foo + bar;
在表达式foo + bar
的求值过程中,foo
和bar
的值是否保证会提升为int
类型的值,还是实现可以将它们提升为unsigned int
?
根据第6.2.5节第8段:
对于两种有相同符号且不同整数转换等级(见6.3.1.1)的整数类型,具有较小整数转换等级的类型值范围是另一种类型值范围的子集。
根据第6.2.5节第9段:
如果一个
int
类型可以表示原始类型的所有值,则将该值转换为int
;否则,将其转换为unsigned int
。
较小整数转换等级的整数类型具有值范围是另一种类型值范围的子集的保证似乎取决于整数类型的符号。
signed char
对应于signed int
unsigned char
对应于unsigned int
这是否意味着unsigned char
的值仅保证在unsigned int
的子集中,而不一定是int
的子集?如果是这样,这是否意味着实现可能理论上有一个unsigned char
值不在int
的子集中?
int
至少要有16位,但是没有什么可以阻止unsigned char
和int
一样宽(例如都是24位),这种情况下unsigned char
将会提升为unsigned int
。 - Pascal Cuoq