Это самая странная вещь, которая когда-либо случалась со мной при программировании на С++.
Это мой основной файл:
#include <iostream>
#include "lib/utils.h"
using namespace std;
int main(int argc, const char *argv[]) {
cout << bin2dec(101000010);
return 0;
}
и это 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;
}
Программа компилируется без предупреждений, а при запуске она выводит 450
. 450 не равно 101000010 в десятичном значении, 322 есть. Первая странная вещь заключается в том, что разница между 482 и 322 равна 128. Это происходит с любым двоичным числом, которое вы пытаетесь преобразовать. Но что ДЕЙСТВИТЕЛЬНО странно, это то, что когда я пытался вывести значение bin
и dec
внутри for
в попытке отладки функции, он внезапно начал работать правильно.
В принципе, по какой-то причине, если вы std::cout
что-то перед возвратом функции, оно работает. Если вы этого не сделаете, он добавит 128 к результату.
Я использую g++ 4.6.0 и компилирую вот так:
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