Диапазон подписанного символа - PullRequest
17 голосов
/ 10 октября 2010

Почему диапазон знака со знаком составляет от -128 до 127, а не от -127 до 128?

Ответы [ 6 ]

28 голосов
/ 10 октября 2010

Это объясняется тем, как кодирование дополнения до двух работает: 0 обрабатывается как «положительное» число (бит со знаком), поэтому количество доступных положительных значений уменьшается на единицу.

В кодировке добавок (что в наши дни встречается не очень часто, но в старину) существовали отдельные значения для +0 и -0, и поэтому диапазон для 8 количество битов от -127 до +127.

14 голосов
/ 10 октября 2010

В 8-битовых 2-х кодовых числах дополнения 2 -128 и +128 имеют одинаковое представление: 10000000. Итак, разработчик аппаратного обеспечения сталкивается с очевидной дилеммой: как интерпретировать битовый шаблон 10000000. Формально это будет работать в любом случае. Если они решат интерпретировать его как +128, результирующий диапазон будет -127..+128. Если они решат интерпретировать его как -128, результирующий диапазон будет -128..+127.

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

Стоит отметить, однако, что спецификация языка не требует реализации с 2-мя дополнениями для обработки битовой комбинации 100...0 как допустимого значения в любом целочисленном типе со знаком. Например. реализациям разрешено ограничивать 8-битный диапазон signed char до -127..+127 и рассматривать 10000000 как недопустимую битовую комбинацию (представление прерываний).

7 голосов
/ 10 октября 2010

Я думаю, что простой способ объяснить это для обычной души:

Бит - это значение 0 или 1, или 2 варианта

2-битное удержаниедве комбинации или 0 и 1 для четырех возможных значений: 00, 01, 10 и 11.

3-битный содержит три комбинации, в общей сложности восемьвозможные значения: от 000 до 111.

Таким образом, n-бит содержит n комбинаций для общего количества 2 ^ n возможных значений.Следовательно, 8-битное значение равно 2 ^ 8 = 256 возможных значений.

Для чисел со знаком самый старший бит (первый, читающий значение слева направо) - это бит знака;это оставляет возможность 2 ^ (n-1) возможных значений.Для 8-разрядного числа со знаком это 2 ^ 7 = 128 возможных значений для каждого знака.Но поскольку положительный знак включает в себя ноль (от 0 до 127 = 128 различных значений и 128 + 128 = 2 ^ 8 = 256), отрицательный знак также включает в себя от -1 до ... -128 для 128 различных значений.Где:

10000000 = -128
...
11111111 = -1
00000000 = 0
...
01111111 = 127
3 голосов
/ 11 октября 2010
#include <limits.h>
#include <stdio.h>
...

printf("range of signed character is %i ... %i", CHAR_MIN, CHAR_MAX );
1 голос
/ 03 ноября 2017

Если вы посмотрите на диапазоны символов и целых, кажется, что есть еще одно число с отрицательной стороны.Это потому, что отрицательное число всегда сохраняется как комплимент 2 его двоичного файла.Например, давайте посмотрим, как хранится -128.Сначала вычисляется двоичный код из 128 (10000000), затем получается его 1 комплимент (01111111).Комплимент 1 получается путем изменения всех 0 на 1 и 1 на 0.Наконец, комплимент 2 этого числа, то есть 10000000, сохраняется.Комплимент 2 получается путем добавления 1 к комплименту 1.Таким образом, для -128 10000000 сохраняется.Это 8-битное число, и его можно легко разместить на символе.В отличие от этого, +128 не может быть сохранено в символе, потому что его двоичный код 010000000 (крайний левый 0 для положительного знака) является 9-битным числом.Однако +127 может быть сохранено, поскольку его двоичный код 01111111 оказывается 8-разрядным числом.

1 голос
/ 10 октября 2010

Если вы просто рассматриваете двойное дополнение как арифметическое по модулю 256, то разрыв между положительным и отрицательным является чисто произвольным.С таким же успехом можно было бы поставить его на 63 / -192, 254 / -1, 130 / -125 или где-либо еще.Тем не менее, в качестве стандартного целочисленного формата со знаком, дополнение к двум пришло по соглашению, установив ограничение на 127 / -128.Эта отсечка имеет одно большое преимущество: устанавливаемый старший бит напрямую соответствует отрицательному числу.

Что касается языка C, он оставляет формат чисел со знаком вплоть до реализации, но предлагает только 3 варианта:реализации, все из которых используют «знаковый бит»: знак / величина, единицы дополняют и две дополняют.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...