在《The C Programming Language》的第一版中,unsigned 准确地指定一种类型,没有 unsigned char、unsigned short 或 unsigned long。但在此后不久,大多数 C 编译器增加了这些类型。一些编译器未实现 unsigned long,而包括了另外两种类型。自然地,当这些新类型与在表达式中其他类型混合时,实现为类型提升选择不同的规则。
在大多数 C 编译器中,使用更简单的规则,即无符号保留。需要展宽无符号类型时,其将展宽为无符号类型;当将无符号类型与有符号类型混合时,结果是有符号类型。
ISO C 指定的另一个规则称为“值保留”, 其中结果类型取决于操作数类型的相对大小。当展宽 unsigned char 或 unsigned short 类型时,如果 int 的长度足以表示较短类型的所有值,则结果类型为 int。否则,结果类型为 unsigned int。对于大多数表达式,值保留规则产生较少意外的算术结果。