Преобразование отрицательного значения long, хранящегося в шестнадцатеричном виде в строке, в переменную long в C ++ - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь преобразовать поток строк в шестнадцатеричном формате в длинный. Я пришел сюда за помощью, и решение, которое они дали (работает для коротких, целых и большинства длинных), не работает для отрицательных длинных, для представления которых требуется минимум 16 шестнадцатеричных цифр.

По сути, у меня есть поток строк с именем hx, который я заполнил шестнадцатеричными цифрами, которые должны быть равны -9223372036854775808.

#include <iostream>
#include <sstream>
#include <climits>

using namespace std;

int main() {
    stringstream hx;
    hx << hex << LONG_MIN;
    cout << hx.str() << '\n';

    long value;
    hx >> value;

    cout << value << '\n';
    return 0;
}

Фактический объем производства:

8000000000000000
9223372036854775807

Ожидаемый результат:

8000000000000000
-9223372036854775808

Я не понимаю, почему шестнадцатеричное значение преобразуется в положительное число, когда бит знака равен 1.

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Вот решение и объяснение, как объяснено в другом ответе hx << hex << LONG_MIN будет неявно использовать printf ("% lx", ...), который имеет тип unsigned long: </p>

int main() {
    stringstream hx;
    hx <<hex << (LONG_MIN);
    cout << hx.str() << '\n';

    unsigned long value;
    hx >> value;

    cout << static_cast<long>( value ) << '\n';
    return 0;
}
0 голосов
/ 01 мая 2018

Во-первых, hx << hex << LONG_MIN будет неявно использовать printf("%lx", ...) для печати значения, что приводит к неопределенному поведению , поскольку LONG_MIN не относится к типу unsigned long.

Во-вторых, скажем, hx.str() теперь хранит строку 8000000000000000. Для ввода в value оно интерпретируется как большое положительное число. В результате std::numeric_limits<long>::max(), т.е. 9223372036854775807 сохраняется в value.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...