Sun Studio 12:C 用户指南

6.4.1 背景

根据 K&R 的《The C Programming Language》(第一版),unsigned 准确地指定一种类型;不存在 unsigned charunsigned shortunsigned long,但是在此之后不久,大多数 C 编译器增加了这些类型。有些编译器未实现 unsigned long,但是包含了其他两种类型。自然地,当这些新类型与在表达式中其他类型混合时,实现为类型提升选择不同的规则。

在大多数 C 编译器中,使用比较简单的规则“无符号保留”:当无符号类型需要展宽时,将被展宽为无符号类型;当无符号类型与带符号类型混合时,结果为无符号类型。

ISO C 指定的另一个规则称为“值保留”,其中结果类型取决于操作数类型的相对长度。当展宽 unsigned charunsigned short 类型时,如果 int 的长度足以表示较短类型的所有值,则结果类型为 int。否则,结果类型为 unsigned int。对于大多数表达式,值保留规则产生最常见类型的算术结果。