【发布时间】:2013-07-26 18:44:30
【问题描述】:
假设如下:
unsigned char foo = 3;
unsigned char bar = 5;
unsigned int shmoo = foo + bar;
是否保证foo 和bar 值被提升为int 值以评估表达式foo + bar - 或者是否允许实现将它们提升为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?如果是这样,这是否意味着一个实现理论上可能具有一个不在int 子范围内的unsigned char 值?
【问题讨论】:
-
除非你找到一个 int 为 8 位的系统,否则它应该像第 6.2.5 节第 9 段指出的那样工作。
-
@GrijeshChauhan 我认为该网站假设整数类型的最小幅度。我相信实现只需要支持这些最小幅度,但允许将范围幅度定义为更大(第 5.2.4.2.1 节:
Their implementation-defined values shall be equal or greater in magnitude (absolute value) to those shown, with the same sign.)。 -
@VilhelmGray 我刚刚问是因为您似乎在发布相关问题,.. 好吧@Ouah 正在帮助您,祝您好运!
-
@hetepeperfan 在标准 C 编译器中,
int必须至少为 16 位,但没有什么能阻止unsigned char与int一样宽(例如都是 24 位)哪种情况unsigned char会提升为unsigned int。
标签: c type-conversion c99 integer-promotion type-promotion