Например, в c ++, если адрес памяти переменной отображается как 0XFFF, я не уверен, что это 2047 или 4095 (включая «знаковый бит»). 0xFFF — 1111 1111 1111 в двоичном формате. И недавно я узнал о «знаковом бите», который просто указывает, является ли число положительным или отрицательным. Мое другое предположение состоит в том, что это будет 0000 0000 0001 после преобразования в положительное число дополнения 2.
Поэтому у меня такой вопрос: адрес памяти 0XFFF указывает, что это 4095 или 2047? или, может быть, это 1?
0xFFF
может быть или. В шестнадцатеричном виде это всего лишь биты — все остальное в том, как вы это интерпретируете. Это также зависит от ширины типа данных, о котором мы говорим.
Предполагая, что вы не используете 12-битный тип данных, конкретное значение, которое вы показали, всегда 4095.
Теперь, если мы установим ширину нашего целого числа и выберем другое значение, все станет более интересным. Возьмите 16-битное значение 0xFFFF, например:
uint16_t
), это 65535.int16_t
), это -1.Адреса памяти, как правило, рассматриваются как значения без знака, поэтому дополнение к двум в этом отношении не играет роли.
Для подписанных примитивных типов C ++ стандарту все равно. Сохраняется ли это как дополнение к двум или нет, определяется архитектурой процессора, которая используется для архитектуры x86 и большинства архитектур второго варианта благодаря простоте аппаратной реализации.