Страницы

Поиск по вопросам

воскресенье, 9 февраля 2020 г.

Почему пределы чисел именно такие?

#история


Почему почти во всех языках программирования данные ограниченны именно степенью двойки?

char (-127, 127) or (0, 255)
127 = (2^7) - 1 ; 255 = (2^8) - 1


и вопрос еще почему тут на 1 меньше, а не ровно 128 и 256?

int (-2147483648, 2147483647)
-2147483648 = -(2^31) ; 2147483647 = (2^31) - 1


и опять же почему тут на 1 меньше? а в отрицательном значении все нормально.

почему лимит именно такой, причем я посмотрел в других языках программирования также:
везде используется степень двойки. но почему именно двойки а не тройки, не четверки?
почему нельзя было сделать лимит не таким а например вот таким:

int (-1000000000, 1000000000)


а для char тогда:

char (300, 300) или char (1000, 1000)


даже в майнкрафте ограничение по высоте именно в 256 блоков!
почти везде создают буфер из 255 или 256 элементов, особенно когда это касается текста

char buf[255]


так все же почему так сложилось?
    


Ответы

Ответ 1



Имеется теорема Шеннона, согласно которой, для наиболее оптимального кодирования подходит система счисления по основанию e=2.71..... Следовательно, оптимальными будут системы по основанию 2 и 3. Для системы счисления по основанию 2 в электротехнике существует вполне очевидная реализация - "напряжение есть - 1", "напряжения нет - 0". Реализация же троичной системы "в железе" оказывается более затратной, поэтому выбрали двоичный подход. Кстати, ЭНИАК работал и вовсе по основанию 10. Теперь о числе 255. Это максимальное целое значение, которое можно записать в 8 бит, то есть, в современный байт. Байт в 8 бит появился не сразу - были и 6 битные машины, и 5,5 (пять-с-половиной. Что? Да!) битные. Но оказалось, что в 4+4 бита удобно помещать двухзначное целое число, которое представляет фрагмент даты. В первые 4 бита - первую цифру, во вторые 4 - вторую цифру. Кроме того, в 255 кодов можно было поместить весь английский алфавит, цифры, спец-символы, и какой-то национальный алфавит. То есть, 8 бит дают оптимальный баланс между стоимостью производства электроники в середине 20 века и удобством использования. Все остальные размеры, это случаи с кратными байту величинами - 2^16, 2^32 и далее. Для работы с отрицательными числами используется, в частности, дополнительный код - чтобы записать отрицательное число, нужно перевернуть биты соответствующего положительного числа и прибавить 1. Именно сюда и девается недостающая единичка. Нужно это для того, чтобы 0 представлялся однозначно, иначе бы 00000000 == 11111111 в дополнительном коде, то есть, существовало бы два нуля.

Ответ 2



Всё упирается в принципы передачи информации. За раз мы можем передать только 1 бит информации, который принимает два (двойка в первой степени) значения - 0 и 1 для false и true соответственно. За два раза мы можем передать 2 бита информации, которые принимают уже 4 (двойка во второй степени) значения - 00 01 10 11 За три раза мы можем передать 3 бита, которые принимают 8 (двойка в третьей степени) значений - 000 001 010 011 100 101 110 111. И так до бесконечности, пока не устанешь :) Теперь по поводу числового типа данных int. Положительное количество принимаемых значений всегда меньше только потому что ноль тоже должен как-то кодироваться, и приходится жертвовать одним положительным числом

Комментариев нет:

Отправить комментарий