请教个int和unsigned int的求和问题
#include <stdio.h>
void main(){
int a=-6;
unsigned int b=4;
int sum=a+b;
printf("%d\n",sum);
printf("%d",a+b);
if(a+b>0)
printf("Positive");
printf("\n");
}
vc6.0编译结果是:
-2
Positive
[解决办法]
在C/C++里无符号数和有符号数一起参与表达式时,会发生一些隐式转换。
在语句int sum=a+b;时这个转换就发生了,a+b结果给有符号sum时,得到了我们
看起来正常的结果。
在if(a+b>0),在这个表达式中,a+b与0比较时,a+b的结果-2被转成了无符号数,
而一个负数被转换成无符号数会变成一个很大的正数(从二进制位表示可以知道,
变成无符号数时,最高位符号位也用来表示数了), 这一比较当然就得出了你的结果。
如果你这样:
if(static_cast<int>(a+b)>0)
printf("Positive\n");
else
printf("Negative\n");
或者直接:
if(sum>0)
就会得到期望的结果。
应避免这种用法,甚至不要使用无符号数(这也JAVA里只支持有符号数的原因),除非用来表示字节数据。
[解决办法]
当int和unsigned int运算时,转为unsigned int
int sum=a+b; 实际上是int sum=(int)((unsigned int)a+b); 因为sum为int
printf("%d",a+b); 实际上是printf("%d",(int)((unsigned int)a+b)); 因为指定了%d而不是%u
if(a+b>0) 实际上是if( (unsigned int)a+b>(unsigned int)0 )
[解决办法]
当int和unsigned int运算时,转为unsigned int
int sum=a+b; 实际上是int sum=(int)((unsigned int)a+b); 因为sum为int
printf("%d",a+b); 实际上是printf("%d",(int)((unsigned int)a+b)); 因为指定了%d而不是%u
if(a+b>0) 实际上是if( (unsigned int)a+b>(unsigned int)0 )
[解决办法]
- C/C++ code
void main(){int a=-6;unsigned int b=4;int sum=a+b;//a提升成无符号int来计算, 计算完之后的结果又转换成有符号intprintf("%d\n",sum); if(a+b>0)//a提升成无符号int来计算, 结果是无符号int肯定>=0printf("Positive");}