C语言进行了许多运营商的“通常的算术转换” - 的转换在C99标准的6.3.1.8中概述。对于整数操作数,首先进行促销活动,这是造成您的问题的原因。促销在6.3.1.1(算术操作数/布尔,字符和整数)中概述,其中包括:
如果int可以表示原始类型的所有值,则该值将转换为INT;否则,它被转换为一个unsigned int。这些被称为整数促销。所有其他类型均不受整数升级的影响。
的优惠仅应用于物体或表达与整数类型与秩小于int
和unsigned int
(或位域)。
所以在你exression:
t1 < t2-1
即使变量unsigned short
他们晋级到int,因为你的平台上int
可以代表unsigned short
所有的值。因此,使用int
类型评估表达式,并且不发生下溢 - 表达式的t2-1
部分最终为负1。
在表达式:
s1 < s2-1
的unsigned long
类型不促进,因为它们具有比int
/unsigned int
较高“秩”,所以表达式是使用无符号算术运算(从底流评价减法),并且s2-1
子表达式的计算结果为一个非常大的数量,而不是负1.
作为litb在评论所指出的,如果该平台已int
实现为一个16位的类型(这是允许的 - MS-DOS为例如),亲因为int
将不能代表unsigned short
(unsigned short
必须至少为16位)的所有值,所以unsigned short
的运动将是unsigned int
而不是int
。在这种情况下,两个if
语句将评估为true。
〜nairboon:我希望你不介意编辑。我替换的代码在功能上是相同的,但可以复制/粘贴到编辑器中并进行编译而不用更改。 – 2009-09-12 16:51:25
请注意,这个结果不能保证是结果。在int存储与short相同的值范围的机器上(我认为16位机器将会),你会看到两个ifs的输出,因为升级会转换为unsigned int,而不是int。 – 2009-09-12 18:37:11