Esto es lo más extraño que me ha pasado al programar en C++.Error que desaparece al intentar estudiarlo
Este es mi archivo principal:
#include <iostream>
#include "lib/utils.h"
using namespace std;
int main(int argc, const char *argv[]) {
cout << bin2dec(101000010);
return 0;
}
y esto es 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;
}
El programa compila sin advertencias, y cuando se ejecuta, se da salida a 450
. 450 no es 101000010 en decimal, 322 es. Lo primero extraño es que la diferencia entre 482 y 322 es exactamente 128. Esto sucede con cualquier número binario que intente convertir. Pero lo que es REALMENTE raro, es que cuando traté de generar el valor de bin
y dec
dentro del for
en un intento de depurar la función, de repente comenzó a funcionar correctamente.
Básicamente, por alguna razón, si std::cout
algo antes de que la función regrese, funciona. Si no lo hace, agrega 128 al resultado.
estoy usando g ++ 4.6.0, y la compilación de la siguiente manera:
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 para una pregunta bien hecha –
Esto es extremadamente común: bienvenido al mundo del comportamiento indefinido. –
@Doug ¿Quizás me puedas explicar cuál es la pregunta? –