个人Blog: hhktony.com
全部博文(553)
分类: LINUX
2012-02-07 18:12:21
(1)如:
int _tmain(int argc, _TCHAR* argv[])
{
unsigned int a=6;
int b =-20;
printf("value is %d /n",a+b);
printf("value is %u /n",a+b);
return 0;
}
输出是-14 4294967282。可见输出无符号数时是个极大值,有符号数时是负数。
(2)如:
int main(int argc, char* argv[])
{
unsigned int a =6;
int b = -20;
if(a+b<6)
printf(“good”);
else
printf(“bad”);
return 0;
}
输
出是bad。 首先算术运算符优先级比比较优先级要高,先运算a+b,这个值是得-14。如果认为-14<6为1输出good就错了,由于计算机内部是用值的补码来运算的,会转化成0x0000 00006+ 0xffff ffec,算得的结果是0xffff
fff2。而面对比大小或者除法等混合运算时,是全都转化成无符号来进行的,把0xfffffff2当成无符号数来对待,当然就成了一个极大
值,<6是不可能的,所以这个结果是bad。为此我们可以做个实验,当改成if(a+b<0xfffffff3)时,输出就是good。因为
无符号运算时,0xfffffff2<0xfffffff3成立。可以这样理解这个问题:当signed和unsigned作比较和除法混用的时候,全部自动提升为无符号整数。
(3)
如果不是运算时,可举另外一个例子:
int main(int argc, char* argv[])
{
int sum;
sum = -6;
if(sum>0)
{
printf("%d",sum);
printf("++");
}
else if(sum<0)
{
printf("%d",sum);
printf("--");
}
return 0;
}
Sum是-6,输出-6--;Sum是6,输出6++。如果不是混合运算,那么不改变符号数的属性。