遇到一个问题。。。
#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.
[解决办法]
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了