Ошибка, которая исчезает при попытке изучить

Это самая странная вещь, которая когда-либо происходила со мной при программировании на 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 
10
задан Gerardo Marset 9 June 2011 в 02:27
поделиться