2013-10-03 4 views
0

Я знаю, что есть тонны учебников онлайн о том, как конвертировать из строки в шестнадцатеричную. Ну, у меня проблема с этим.Как конфертировать из двоичной строки из 32 символов в шестнадцатеричный?

Мой код (см. Ниже) работает до 31 символа, и я не могу задуматься о том, почему. Всякий раз, когда есть 32 символа, он просто высвечивается при 7fffffff.

мне нужно, чтобы иметь возможность ввода что-то вроде «111111111100000000001010101000»

Должно быть легко исправить просто не уверен, где

Моя попытка (компилируется):

#include <iostream> 
#include <string> 
#include <sstream> 
using namespace std; 
int main() 
{ 
    int Base = 2; 
    long x; 
    char InputString[40]; 
    char *pEnd = NULL;   // Required for strtol() 


    cout << "Number? "; 
    cin >> InputString; 
    x = strtol(InputString, &pEnd, Base);  // String to long 

    cout << hex << x << endl; 
    return 4; 
} 

ответ

1

Это, вероятно, происходит потому, что длинный 32 бит на вашем компьютере, а signed long не может хранить 32 бита в дополнении 2. Вы можете попытаться использовать unisgned (который не «отбрасывает» бит для знака) или long long, который имеет ширину 64 бит.

unsigned long x = strtoul(InputString, &pEnd, Base); 
        ^^^^ 

Или long long:

long long x = strtoll(InputString, &pEnd, Base); 

Функции strtol и strtoul были доступны в течение длительного времени в C++. Действительно, strtoll и long long были введены в C++ 11.

+0

ваше решение имеет смысл, однако, нет никакой известной библиотеки для любой прогулки или strtoul – cmonnats23

+0

@ cmonnats23 Я отредактировал свой ответ. Используйте 'strtoul', если у вас нет' long long'. – cnicutar

+0

Каковы же минусы при создании x unsigned и использовании strtoul? например, почему это было бы плохо? также, не уверен, когда был выпущен C++ 11, но на VS2012 strtoll недоступен. если у меня нет чего-то другого, я должен #include – cmonnats23

1

long может» t хранит более 32 бит (фактически 31 плюс бит знака). Попробуйте long long int и strtoll(), если вы хотите более 32 бит, или unsigned long и strtoul(), если 32 достаточно.

+0

'long long' где? при инициализации x? Это не сработало. Тебе, ты поднимаешь хороший момент. возможно, я не могу использовать функцию strtol, потому что она конвертирует ее в длинную, которая составляет всего 32 бита? – cmonnats23

Смежные вопросы