#история
Почему почти во всех языках программирования данные ограниченны именно степенью двойки? 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. Положительное количество принимаемых значений всегда меньше только потому что ноль тоже должен как-то кодироваться, и приходится жертвовать одним положительным числом
Комментариев нет:
Отправить комментарий