首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

遇到一个有关问题。

2012-08-15 
遇到一个问题。。。#include iostreamusing namespace stdint main(){unsigned long b 100double a -

遇到一个问题。。。
#include <iostream>

using namespace std;


int main()
{

unsigned long b = 100;
double a = -1 * b / 100;
cout<< a <<endl;
system("pause");

}

输出结果4.29497e+007。。。。
是不是unsigned int 和int 的相乘不能直接乘?-1*b 被转化成了unsigned int ,然后 又给直接转成int, 而部存储结构确实unsigned int 的。于是造成这种情况。。~

[解决办法]
在进行运算的过程中需要将类型转换为同一类型,所以int被隐式转换为了uint。
这就如同用int * float ,int被隐式转换为了float一样,你可以看看编译器编译的输出,可能提示你int已经被转换为了unit.
[解决办法]

探讨

在进行运算的过程中需要将类型转换为同一类型,所以int被隐式转换为了uint。
这就如同用int * float ,int被隐式转换为了float一样,你可以看看编译器编译的输出,可能提示你int已经被转换为了unit.

[解决办法]
Assembly code
6:    double a = -1 * b / 100;0040102F   mov         eax,dword ptr [ebp-4]00401032   imul        eax,eax,0FFh00401035   xor         edx,edx00401037   mov         ecx,64h0040103C   div         eax,ecx;此时eax的值为028F5C27(0000 0010 0100 1111 0101 1011 0010 0111)0040103E   mov         dword ptr [ebp-14h],eax00401041   mov         dword ptr [ebp-10h],000401048   fild        qword ptr [ebp-14h];把028F5C27值加载到浮点寄存器0040104B   fstp        qword ptr [ebp-0Ch];把028F5C27按IEEE 754规定以double的解析再存到[ebp-0Ch],于是就有了这个结果。
[解决办法]
int和unsigned long相乘得到的结果的数据类型是unsigned long。

楼上哥们说的最后一句很正确,缺省转型都是向大的那个转的。可以用如下的方式证明:
cout << typeid(-1 * b).name() << endl;// 会输出unsigned long
[解决办法]
-1 * b
这边变成unsigned int了

热点排行