Как преобразовать двоичную строку из 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;
}

0

Решение

Это, вероятно, происходит из-за того, что длина на вашем компьютере составляет 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.

1

Другие решения

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

1

По вопросам рекламы [email protected]