【发布时间】:2012-05-25 09:01:04
【问题描述】:
usigned int x=1;
signed int y = -1;
double z = y * x * 0.25;
我正在使用 Microsoft Visual Studio 10 C++ 编译器。 为什么 z 没有 -0.25 值? 正如我从反汇编中看到的那样,它进行有符号整数乘法(imul),将 edx 的结果放在堆栈上,并用 0! 扩展它,因为它将是一个无符号整数。之后,它使用 FP 指令将其相乘。
.............
imul edx,dword ptr [ecx]
mov dword ptr [ebp-98h],edx
mov dword ptr [ebp-94h],0
fild dword ptr [ebp-98h]
fmul qword ptr [__real@3fd0000000000000 (1402FB8h)]
fstp qword ptr [z]
为什么有符号*无符号相乘的结果被解释为无符号?
【问题讨论】:
-
你在哪里看到零扩展?
[ebp-94h]与乘法的结果无关,fild采用dword而不是qword。 -
有非常具体的积分提升规则,不同的积分类型参与二元运算。我的猜测是,在那里的某个地方,正确的行为是精确的,但老实说,这是一团糟......
-
是的,没错,怪编译器。
-
作为一个经验法则:如果您没有丰富的 C/C++ 经验并且认为您发现了编译器错误,则意味着您自己的代码中存在错误。如果错误与隐式类型提升有关,则尤其如此。
-
正如你所说,你使用的是 C++ 编译器,我们可以从这个问题中删除 C 标记吗?
标签: c++ visual-studio-2010 visual-c++