Подсчет бита знака в дополнении 2 в адресе памяти

Например, в c ++, если адрес памяти переменной отображается как 0XFFF, я не уверен, что это 2047 или 4095 (включая «знаковый бит»). 0xFFF — 1111 1111 1111 в двоичном формате. И недавно я узнал о «знаковом бите», который просто указывает, является ли число положительным или отрицательным. Мое другое предположение состоит в том, что это будет 0000 0000 0001 после преобразования в положительное число дополнения 2.
Поэтому у меня такой вопрос: адрес памяти 0XFFF указывает, что это 4095 или 2047? или, может быть, это 1?

0

Решение

0xFFF может быть или. В шестнадцатеричном виде это всего лишь биты — все остальное в том, как вы это интерпретируете. Это также зависит от ширины типа данных, о котором мы говорим.

Предполагая, что вы не используете 12-битный тип данных, конкретное значение, которое вы показали, всегда 4095.

Теперь, если мы установим ширину нашего целого числа и выберем другое значение, все станет более интересным. Возьмите 16-битное значение 0xFFFF, например:

  • Истолковано как неподписанный целое число (т.е. uint16_t), это 65535.
  • Как подписанный целое число (т.е. int16_t), это -1.
0

Другие решения

Адреса памяти, как правило, рассматриваются как значения без знака, поэтому дополнение к двум в этом отношении не играет роли.

Для подписанных примитивных типов C ++ стандарту все равно. Сохраняется ли это как дополнение к двум или нет, определяется архитектурой процессора, которая используется для архитектуры x86 и большинства архитектур второго варианта благодаря простоте аппаратной реализации.

0

По вопросам рекламы [email protected]