Как определить, является ли значение hex отрицательным?

Я только что научился читать шестнадцатеричные значения. До сих пор я воспринимал их только как положительные числа. Я слышал, что вы также можете писать отрицательные шестнадцатеричные значения.

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

источники, которые я нашел:
https://stackoverflow.com/a/5827491/5016201
https://coderanch.com/t/246080/java-programmer-OCPJP/certification/Negative-Hexadecimal-number

Если я правильно понял, это означает, что:
Если шестнадцатеричное значение, записанное со всеми его битами, имеет что-то > 7 в качестве первой шестнадцатеричной цифры, оно отрицательно.
все "F" в начале или первая цифра просто означает, что значение отрицательное, оно не рассчитывается.

Например, если шестнадцатеричное значение записано в 32 битах:
FFFFF63C = > отрицательный ( -2500 ?)
844fc0bb = > отрицательный ( -196099909 ?)
F44fc0bb = > отрицательный ( -196099909 ?)
FFFFFFFF => отрицательный ( -1 ?)
7FFFFFFF => положительный

Я прав? Если нет, не могли бы вы сказать мне, что я неправильно понял?

3 ответов


прочитайте представление дополнения Two:https://en.wikipedia.org/wiki/Two%27s_complement

Я думаю, что самый простой способ понять, как обрабатываются отрицательные числа (обычно), - записать небольшое двоичное число, а затем выяснить, как сделать вычитание на единицу. Когда вы достигнете 0 и примените этот метод еще раз - вы увидите, что внезапно получите все 1. И именно так (обычно) представляется" -1": все единицы в двоичном формате или все f в шестнадцатеричном. Обычно, если вы работаете со знаковыми числами, они представлены первым (наиболее значительным) битом, являющимся единицей. То есть, если вы работаете с числом битов,кратным четырем,то число отрицательно,если первая шестнадцатеричная цифра равна 8,9,A,B, C, D, E или F.

метод отрицания:

  1. инвертировать все биты
  2. добавить 1

еще одно преимущество этого представления (дополнение двух) заключается в том, что вы получаете только одно представление для нуля, чего не было бы, если бы вы отметили подписанные числа, установив MSB или просто перевернув их.


из того, что я понимаю, вам всегда нужно смотреть на самую левую цифру, чтобы сказать знак. Если в hex, то что-либо из 0-7 положительно, а 8-F отрицательно. Кроме того, вы можете конвертировать из шестнадцатеричного в двоичный, и если в самой левой цифре есть 1, то число отрицательное.

ХЕКС БИНАРНЫЕ ЗНАК
0-7 0000-0111 pos
8-F 1000-1111 neg


ответ здесь форуме выглядит хорошо:

каждая шестнадцатеричная "цифра" составляет 4 бита. D в позиции высокого порядка это 1101. Итак, вы видите, что у него есть высокий бит одного, поэтому целое номер отрицательный.

и

шестнадцатеричное число всегда положительно (если вы специально не поставили минус знак перед ним). Это может быть интерпретировано как отрицательное число как только вы сохраните его в определенном типе данных. Только тогда больше всего значительный бит (MSB) имеет значение, но это MSB числа " как хранится в этом типе данных". В этом отношении ответы выше только частично правильно: только в контексте фактического типа данных (как int или длинный) имеет значение MSB.

Если вы храните "0xdcafe" в int, его представление будет "0000 0000 0000 1101 1100 1010 1111 1110" - MSB-это 0. А представление "0xdeadcafe" является " 1101 1110 1010 1101 1100 1010 1111 1110" - MSB-это 1.