Это самая странная вещь, которая когда-либо происходила со мной при программировании на C ++.
Это мой основной файл:
#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
внутри для
при попытке отладки функции она внезапно начала работать правильно.
В принципе, по какой-то причине, если вы 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