Sun Studio 12:C 用户指南

6.4.3 第一个示例:强制类型转换的使用

在以下代码中,假定 unsigned charint 窄。


int f(void)
{
    int i = -2;
    unsigned char uc = 1;

   return (i + uc) < 17;
}

以上代码导致编译器在您使用 -xtransition 选项时发出以下警告:

line 6: warning: semantics of "<" change in ISO C; use explicit cast

加法运算结果的类型为 int(值保留)或 unsigned int(无符号保留),但二者之间的位模式不会更改。在二进制补码机器上,我们获得:


    i:       111...110 (-2)
+   uc:      000...001 ( 1)
===================
        111...111 (-1 or UINT_MAX)

这种位表示对应于 -1(对于 int)或 UINT_MAX(对于 unsigned int)。因此,如果结果类型为 int,则使用带符号比较且小于测试为真;如果结果类型为 unsigned int,则使用无符号比较且小于测试为假。

强制类型转换的加法用来指定这两种行为之中所期望的行为:


value preserving:
    (i + (int)uc) < 17
unsigned preserving:
    (i + (unsigned int)uc) < 17

由于不同的编译器对相同的代码选择的不同的含义,因此该表达式存在歧义。强制类型转换的加法帮助阅读器并消除警告消息。