Легче всего думать о числах с фиксированной точкой как с масштабированием целых чисел, а не смещенных целых чисел. Для данного типа с фиксированной запятой существует фиксированная шкала , которая является степенью двойки (или десяти). Чтобы преобразовать действительное значение в целочисленное представление, умножьте его на этот масштаб. Чтобы преобразовать обратно, просто разделите. Тогда вопрос о том, как представлены отрицательные значения, становится подробностью целочисленного типа, с которым вы представляете свое число.
Пожалуйста, кто-нибудь скажет мне, какой источник является правильным ...
И то и другое проблемно c.
Ваш первый источник неверен. Данный пример не ...
такой же, как числа дополнения 2.
В дополнении к двум, MSB (старший значащий бит) вес отрицается, но другие биты все еще дают положительные значения. Таким образом, число дополнения до двух со всеми битами, установленными в 1, не дает минимальное значение.
Ваш второй источник может быть немного вводящим в заблуждение, когда он говорит ...
сдвигая битовую комбинацию числа вправо на 1 бит, всегда делим число на 2.
Этот оператор затрагивает проблему недостаточного значения, которое возникает, когда LSB (младший значащий бит) устанавливается в 1, а результирующее округление. Сдвиг вправо обычно приводит к округлению до отрицательной бесконечности, тогда как деление приводит к округлению до нуля (усечение). Оба производят одинаковое поведение для положительных чисел: 3/2 == 1
и 3>>1 == 1
. Для отрицательных чисел они противоположны: -3/2 == -1
, но -3>>1 == -2
.
... есть ли стандартное представление для чисел со знаком с фиксированной точкой ?
Я так не думаю. Существуют языковые стандарты c, например, ISO / IEC TR 18037 ( черновик ). Но соглашение о масштабировании целых чисел для аппроксимации действительных чисел заданного диапазона и разрешения хорошо известно. Как представлены базовые целые числа, это другой вопрос.
Кроме того, если представление дополнения 2 было правильным, то как представлять отрицательные числа с нулевой целой частью. Например -0,125?
Это зависит от формата вашего целого числа и вашего выбора radix. Предполагая 16-разрядное число с двумя дополнительными числами, представляющее двоичные значения с фиксированной запятой, масштабный коэффициент равен 2^15
, что составляет 32,768
. Умножьте значение для хранения как целое число: -0.125*32768. == -4096
и разделите, чтобы получить его: -4096/32768. == -0.125
.