usigned int x=1;
signed int y = -1;
double z = y * x * 0.25;
Microsoft Visual Studio 10 C++ 컴파일러를 사용하고 있습니다. 왜 z에는 -0.25 값이 없습니까? 해시에서 보았 듯이 부호있는 int 곱셈 (imul)을 만들고, edx의 결과를 스택에 배치하고, 부호없는 int 일 때 0으로 확장합니다. 그런 다음 FP 명령을 사용하여이를 곱합니다.Microsoft C++ 컴파일러에 버그가 있습니까?
.............
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 [[email protected] (1402FB8h)]
fstp qword ptr [z]
왜 서명 된 * 부호없는 결과가 부호없는 것으로 해석되는 이유는 무엇입니까?
어디에서 영 (zero) 확장자가 보입니까? '[ebp-94h]'는 곱셈의 결과와 관련이 없으며'fild'는'qword '가 아닌'dword'를 취합니다. – Dani
서로 다른 정수 타입이 바이너리 연산에 참여하는 매우 구체적인 통합 승격 규칙이 있습니다. 내 추측에 따르면, 어딘가에 올바른 행동이 무엇인지 정정 될 것이지만 솔직히 그것은 엉망입니다. –
그래, 맞아, 컴파일러를 비난 해. –