2016-12-06 7 views
1

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

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

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

EDIT:

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

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

+1

@kiner_shah hex is std :: hex скорее всего. – Borgleader

+0

@ Борлидер, понял! :-) –

+0

О, извините, я пропустил, чтобы сказать вам, что я включил 'using namespace std;' в моем коде. поэтому std :: hex ничего не изменит, не так ли? :) – Jennan

ответ

1

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

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

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

+0

Спасибо за ваш ответ, я не понимаю его полностью, потому что английский не мой родной язык, а также я программирую старую версию C++, которая не позволяет мне использовать int32_t, но то, что вы говорите, MSB, который в случае 0x32ffffff будет первым f после thw 2, правильно? и оценивать, если оно равно 8 или выше, что будет означать отрицательное число. Правильно ли я это понял? Кроме того, после того, как я знаю, что это отрицательно или нет, я не могу просто поставить «-» infront ценности, не так ли? Мне нужно вычислить differenlty, это правильно? – Jennan

+0

@Jennan 1) Если ваш компилятор не может обработать 'int32_t', вы должны добавить больше значения при использовании стандартного контейнера 2) Да, я говорю, что MSB вашего 24-битного целого будет определять, является ли он отрицательным 3) Нет , вы не можете просто отрицать 24-битное целое число, чтобы получить его отрицательное представление, '-' выполняет операцию дополнения 2, и вы не хотите, чтобы ваше 24-битное целое было изменено, поэтому вам нужно будет сделать это с помощью маски. –

+0

спасибо много !! – Jennan

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

  • Нет связанных вопросов^_^