Korzystanie z Visual Studio 2015 C++, 14.0.25431.01 Aktualizacja 3. Mam nieoczekiwane zachowanie w moim kodzie. Skompilować i uruchomić z 64bit, zwolnij:rzutowanie uint32_t na uint64_t daje inną wartość?
#include <iostream>
#include <stdint.h>
int main(int, char**) {
for (uint32_t i = 1; i < 3; ++i) {
uint32_t a = i * 0xfbd1e995;
uint64_t b = a;
std::cout << a << " 32bit" << std::endl;
std::cout << b << " 64bit" << std::endl;
}
}
Spodziewam się, że a
i b
mają taką samą wartość, ale gdy uruchomię to uzyskać ten wynik:
4224838037 32bit
4224838037 64bit
4154708778 32bit
8449676074 64bit
wygląda na to, że kompilator zastępuje Mnożenie 32-bitowe z mnożeniem 64-bitowym. Czy wolno to zrobić, czy jest to błąd kompilatora? Zarówno g ++, jak i clang dają mi liczby, których bym się spodziewał.
EDIT: mam zaktualizować kod z prostszej wersji, która ma ten sam problem. Ponadto, I've just submitted a bug report.
Nie repro z gcc i brzękiem. To absolutnie nie powinno się zdarzyć. Edycja: również bez repro z VS na rextester. –
Nie można odtworzyć przy użyciu kompilatora mingw i Visual Studio. – SingerOfTheFall
jakiej wersji VS używasz? Czy skompilowałeś Release 64bit? – martinus