правильное преобразование шестнадцатеричного числа в десятичное число (также отрицательные)

Как следует из заголовка, я пытаюсь преобразовать шестнадцатеричные числа, такие как 0x320000dd, в десятичные числа. Мой код работает только для положительных чисел, но не работает, когда речь идет о шестнадцатеричных числах, представляющих отрицательные десятичные числа. Вот отрывок из моего кода:

         cin>>hex>> x;
         unsigned int number = x;
         int r = number & 0xffffff; 

Мой ввод уже в шестнадцатеричном формате, и компьютер автоматически преобразует его в целое число. То, что я пытаюсь сделать, это получить операнд шестнадцатеричного числа, поэтому последние 24 бита. Можете ли вы помочь мне заставить мой код работать с отрицательными значениями, такими как: 0x32fffdc9 или 0x32ffffff? Большое спасибо!

РЕДАКТИРОВАТЬ:

Я хотел бы, чтобы мой вывод был: 0x32fffdc9 --> -567 или 0x32ffffff --> -1

так что только простые десятичные значения, но вместо этого они дают мне 16776649 и 16777215 для верхних примеров.


person Jennan    schedule 06.12.2016    source источник
comment
@kiner_shah hex скорее всего std::hex.   -  person Borgleader    schedule 06.12.2016
comment
@Borgleader, понял! :-)   -  person kiner_shah    schedule 06.12.2016
comment
О, извините, я пропустил, чтобы сказать вам, что я включил «использование пространства имен std;» в моем коде. так что std::hex ничего не изменит, верно? :)   -  person Jennan    schedule 06.12.2016
comment
@ Дженнан, можешь добавить, какой вывод ты хочешь?   -  person apple apple    schedule 06.12.2016
comment
Итак, вы хотите интерпретировать 24-битное значение как int? вам, вероятно, нужно проверить бит знака (и выполнить преобразование) самостоятельно.   -  person apple apple    schedule 06.12.2016


Ответы (1)


Отрицательные целые числа обычно хранятся в дополнении до 2. Это означает, что если ваш старший бит (MSB) не задано, число не является отрицательным. Это означает, что так же, как вам нужно сбросить 8 старших разрядов вашего номера, чтобы зафиксировать 32-битное число в 24-битном положительном числе, вам нужно будет установить 8 старших разрядов числа. ваш номер, чтобы зажать отрицательное число:

const int32_t r = 0x800000 & number ? 0xFF000000 | number : number & 0xFFFFFF;

vector<bool> или bitset могут заслуживать вашего внимания, так как они уточнят шестнадцатеричные числа в диапазоне устанавливаемых битов.

person Jonathan Mee    schedule 06.12.2016
comment
Спасибо за ваш ответ, я не совсем его понимаю, так как английский не мой родной язык, а также я программирую на более старой версии С++, которая не позволяет мне использовать int32_t, но вы говорите, что получаете MSB что в случае 0x32ffffff будет первым f после thw 2, верно? и оцените, если оно равно 8 или выше, что означает отрицательное число. Я правильно это понял? Кроме того, после того, как я узнаю, является ли оно отрицательным или нет, я не могу просто поставить «-» перед значением, верно? Мне нужно рассчитать разницу, это правильно? - person Jennan; 06.12.2016
comment
@Jennan 1) Если ваш компилятор не может обрабатывать int32_t, вам следует больше внимания уделять использованию стандартного контейнера 2) Да, я говорю, что MSB вашего 24-битного целого числа будет определять, является ли оно отрицательным 3) Нет, вы не можете просто инвертируйте 24-битное целое число, чтобы получить его отрицательное представление, - выполняет операцию дополнения 2, и вы не хотите, чтобы ваше 24-битное целое число было изменено, поэтому вам нужно будет сделать это с масками. - person Jonathan Mee; 06.12.2016