Диапазон подписанных char

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

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

бит - это значение 0 или 1, или 2 возможности

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

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

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

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

10000000 = -128
...
11111111 = -1
00000000 = 0
...
01111111 = 127

Ответ 4

#include <limits.h>
#include <stdio.h>
...

printf("range of signed character is %i ... %i", CHAR_MIN, CHAR_MAX );

Ответ 5

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

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

Ответ 6

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