AS400: 此-1(char)非彼-1(int)
在AS400(现在叫IBM i)上,发现了一个奇怪的问题,一个char类型的-1(0xff)和一个int类型的-1(0xffffffff)不相等,两者进行比较时,char类型的-1被转换成了int类型的0x000000ff,导致两者不相等。
#define UNKNOWN (-1)
#define UNKNOWN1 (0x000000FF)
int main()
{
   int a = UNKNOWN;
   char b = UNKNOWN;
   if (a != UNKNOWN)
      printf ("a!=UNKNOWN\n");
   if (b != UNKNOWN)
      printf ("b!=UNKNOWN\n");
   if ((int)b != UNKNOWN)
      printf ("(int)b!=UNKNOWN\n");
   if (b != (char)UNKNOWN)
      printf ("b!=(char)UNKNOWN\n");
   if (b != UNKNOWN1)
      printf ("b!=UNKNOWN1\n");
   if ((int)b != UNKNOWN1)
      printf ("b!=UNKNOWN1\n");
   return 0;
}
输出结果如下:
b!=UNKNOWN
(int)b!=UNKNOWN
按照原理,当一个char转换为一个int时,应当用符号位去填充高位的3个字节,这样保证新的int值和原来的char值相同。显然这里是直接补0了。
直接补0,对于我们开发人员是有影响的。尤其是当我们编写可移植的软件时,比较前最好将长类型强制转换为短类型,否则由于平台的不同,软件的行为会不一样。
这个应该是Power PC芯片的处理方式的问题吧,因为AIX上面用gcc编译也存在这个问题。
哪位达人清楚Power PC芯片这么处理的原因?