почему если из 0 в типе unsigned char, если вычесть 1 ,то получится 255?

в чаре 127+1=-128 это легко объясняется. Но никак не могу объяснить почему 0-1 в unsigned получится не -1 , а 255. Надо объяснить конкретно как 00000000-1 получается 11111111


Ответы (1 шт):

Автор решения: KoVadim

Я попробую дать несколько вариантов ответа, они все приблизительно равнозначны.

Объяснение первое, механическое

Вспомните, как выглядит механический счетчик. Такой могли видеть в старых машинах - он там считает километры (одометр). Или в счетчике воды/электроэнергии. Там несколько колесиков и когда очередное колесо доходит до 9, то оно само превращается в ноль, но при этом прокручивает соседнее.

Счетчик, взято с википедии (взято на википедии https://ru.wikipedia.org/wiki/%D0%A1%D1%87%D1%91%D1%82%D1%87%D0%B8%D0%BA)

А что будет, если на всех колесиках будет 9? все колесики превратятся в нули.

Но можно рассмотреть и процесс кручения в обратном направлении. Тогда при достижении 000, будет 999. Этот считчик - классический пример беззнаковой переменной.

Объяснение второе, математическое.

Арифметика беззнаковых чисел работает как модульная. Для однобайтовых чисел это обычно подразумевает арифметику по модулю 256 (байт обычно 8 бит). В ней (0-1) ≡ 255 (mod 256) и 0 ≡ 256 (mod 256) В си и с++ данное поведение закреплено в стандарте.

Объяснение третье, процессорное.

Компьютерная техника развивалась постепенно и когда то давно были арифмометры. А также счетчики на реле на базе двоичной логики.

Представьте себе, что с завода приходят счетчики по 8 реле, то есть, можно считать до 255, а хотелось бы больше. Не проблема - соединим несколько счетчиков вместе (последовательно). И когда один счетчик доходит до 111...111, на нем выставляем 000...000, а на следующий счетчик перебрасываем единицу. И наоборот (Вы спрашивали, где берется эта единица!). Более того, оказалось, что это очень легко сделать чисто схематически - одно реле себе может переключатся 0-1-0-1 (выключено-включено-выключено-включено)

→ Ссылка