例1:
#include
int main()
{unsigned int a=1;
signed int b=-2;
(a+b==-1)?printf("a+b等于-1\n"):printf("a+b不等于-1\n");
(a+b==4294967295)?printf("a+b等于4294967295\n"):printf("a+b不等于4294967295\n");
return 0;
}
这道程序,有初学者认为a+b==-1,所以输出的是:
a+b等于-1
a+b不等于4294967295
实际上输出:
咦? 怎么a+b又等于-1,又等于4294967295呢? 怎么a+b==-1和a+b==4294967295这两个表达式都为真呢? 因为:a=0x00000001
b=0xfffffffe
a+b=0xffffffff
-1 =0xffffffff
4294967295=0xffffffff
更详细的说明见下面的注释版程序:/*根据C语言隐式类型转换规则,当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。*/
#include
int main()
{unsigned int a=1;//a是无符号整型
signed int b=-2;//b是有符号整型
//内存中的值如下:
//a=0x00000001
//b=0xFFFFFFFE
//a+b=0xFFFFFFFF
//0xFFFFFFFF作为有符号数补码时,即为-1
//0xFFFFFFFF作为无符号数时,即为4294967295
(a+b==-1)?printf("a+b等于-1\n"):printf("a+b不等于-1\n");
//a+b==-1这个表达式中存在unsigned和int两种类型数据,根据隐式类型转换规则,int要转换成unsigned
//a=0x00000001作为无符号数是1, b=0xFFFFFFFE作为无符号数是4294967294
//-1补码是0xFFFFFFFF,作为无符号数看待就是4294967295
//所以a+b==-1为真
//所以上一行语句输出a+b等于-1
(a+b==4294967295)?printf("a+b等于4294967295\n"):printf("a+b不等于4294967295\n");
//a+b==4294967295个表达式中存在unsigned和int两种类型数据,根据隐式类型转换规则,int要转换成unsigned
//a=0x00000001作为无符号数是1, b=0xFFFFFFFE作为无符号数是4294967294
//a+b即为4294967295
//所以a+b==4294967295为真
//所以上一行语句输出a+b等于4294967295
return 0;
}
例2:
#include
#include
int main()
{
char a[10]="abcd";
if(strlen(a)>0)
printf(">0\n");
if(strlen(a)>-1)
printf(">-1\n");
return 0;
}
只输出>0
并没有输出>-1
原因:
strlen()函数的返回值是unsigned类型,在和有符号整型数据比较时,有符号整型要转化成unsigned类型,-1若看作无符号数,那它就是最大的整数,strlen(a)>-1就为假。