To najbardziej dziwna rzecz, jaka mi się przydarzyła podczas programowania w C++.Błąd, który znika podczas próby studiowania.
To jest mój główny plik:
#include <iostream>
#include "lib/utils.h"
using namespace std;
int main(int argc, const char *argv[]) {
cout << bin2dec(101000010);
return 0;
}
a to lib/utils.cpp:
#include <iostream>
#include "utils.h"
int bin2dec(int bin) {
// 101000010
int dec;
//std::cout << ""; // If you uncomment this, it works.
for (int i = 1; bin > 0; i *= 2, bin /= 10) {
if (bin % 2 == 1) {
dec += i;
}
}
return dec;
}
Program kompiluje bez ostrzeżenia, a kiedy uciekać, wyprowadza 450
. 450 to nie 101000010 w systemie dziesiętnym, 322 to. Pierwszą dziwną rzeczą jest to, że różnica między 482 a 322 wynosi dokładnie 128. Dzieje się tak z każdą liczbą binarną, którą próbujesz przekonwertować. Ale to, co jest NAPRAWDĘ dziwne, polega na tym, że kiedy próbowałem wyprowadzić wartość bin
i dec
wewnątrz for
w celu debugowania funkcji, nagle zaczęło działać poprawnie.
Zasadniczo, z jakiegoś powodu, jeśli przed powrotem funkcja powróci, zadziała. Jeśli nie, dodaje 128 do wyniku.
używam g ++ 4.6.0 i kompilacji tak:
g++ -c -D NDEBUG -O2 -o 10.o 10.cpp
g++ -c -D NDEBUG -O2 -o lib/utils.o lib/utils.cpp
g++ -o 10 -Wl,-S 10.o lib/utils.o lib/menu.o
+1 za dobrze zadane pytanie –
Jest to niezwykle powszechne - witamy w świecie niezdefiniowanych zachowań. –
@Doug Być może możesz mi wyjaśnić, na czym polega pytanie? –