hur.cn - 华软网

 热门搜索

求详细解答

  作者:未知    来源:网络    更新时间:2011/4/14
C++">
#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 的啊

---华软 网友回答---
这个跟类型转换有关,,,,,,
---华软网友回复---
这里其实涉及到类型转换的问题,在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。

其它几个有 负数的,你按照上面这样算下就知道结果了。
---华软网友回复---
由于a是无符号的,

a+y计算的时候把y也酿成无符号的了,你能够改成

if( (int)a+y>10 ..........
---华软网友回复---
你定义a是无符号的,计算的时候当然转换成无符号类型进前进算
---华软网友回复---
a是无符号的 传给它-8的时候它实际读到的是一个大于10的数,再加上7更大于10了      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。