#include <iostream>
using namespace std;int cacul(int x,int y);
int main()
{
//------------------------------------------------
cout<<cacul(7,7)<<endl;
cout<<cacul(7,3)<<endl;
cout<<cacul(7,-7)<<endl;
cout<<cacul(7,-8)<<endl;
cout<<cacul(7,-9)<<endl; return 0;
}int cacul(int x,int y)
{
unsigned int a=x;
int c=0; (a+y)>10?(c=1):(c=2); return c;
}
这个程序的输出结果,为什么是:1
2
2
1
1实在搞不懂,前面三个我懂,可是后面的呢,7+(-8) 不是等于-1 么?不是小于10 么?那应该是返回2 的啊

解决方案 »

  1.   

    这里其实涉及到类型转换的问题,在cacul函数中,a为 unsigned int类型,也就是无符号类型数据,函数先 把 x 的值转换为 unsigned int类型的值后赋值给 a,然后计算 (a+y)时,把y转换为了unsigned int 类型再计算的。当你的y为 (-8) 时,它在机器中其实是用二进制补码显示的,补码也就是符号位不变,其余各位取反,然后加 1,这样得到的是这个负数相应的二进制码。
    既然把 (-8) 转换为了 unsigned int 类型了,那么它的二进制中的最高位 1 并不是表示符号位了,你可以自己用笔写下来对比下,假设你的机器是 32位的,那么一个int类型数据是用4个字节也就是 32 位 二进制数来存储的,(-8)的二进制补码和 7 的二进制分别如下:(-8):1111 1111 1111 1111 1111 1111 1111 1000
       7:0000 0000 0000 0000 0000 0000 0000 0111它们相加后,就是
    1111 1111 1111 1111 1111 1111 1111 1111
    它代表的十进制数就是 4294967295 ,这个数肯定比 10 大啊,所以cacul(7,-8) 返回 1。其它几个有 负数的,你按照上面这样算下就知道结果了。
      

  2.   

    因为a是无符号的,a+y计算的时候把y也变成无符号的了,你可以改成if( (int)a+y>10 ..........