![[identity profile]](https://www.dreamwidth.org/img/silk/identity/openid.png)
![[community profile]](https://www.dreamwidth.org/img/silk/identity/community.png)
А вот почему нумерация домов на улице начинается с единицы, а нумерация памяти в компьютере – с нуля?
Это случайно или в этом есть некий сакральный смысл?
А можно ли наоборот?
Дома с нуля, память с единицы?
Если нельзя, то почему?
Это случайно или в этом есть некий сакральный смысл?
А можно ли наоборот?
Дома с нуля, память с единицы?
Если нельзя, то почему?
no subject
Date: 2013-06-27 06:10 pm (UTC)а единица - объктивная.
no subject
Date: 2013-06-27 09:42 pm (UTC)Или с номером 7/6?
Объективная?
(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2013-06-27 06:15 pm (UTC)А в компьютерах нуль = пустая ячейка, естественное начало.
no subject
Date: 2013-06-27 06:17 pm (UTC)no subject
Date: 2013-06-27 06:21 pm (UTC)no subject
Date: 2013-06-27 08:43 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2013-06-27 06:23 pm (UTC)Память же в компьютере не нумеруется, а адресуется (http://ru.wikipedia.org/wiki/%D0%90%D0%B4%D1%80%D0%B5%D1%81%D0%B0%D1%86%D0%B8%D1%8F_%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8), причём множество возможных адресов совпадает со множеством возможных значений ячеек этой же памяти. Ноль в это множество входит.
С точки зрения естественной нумерации, ячейка с адресом 00000000 — первая, 00000001 — вторая, 00000010 — третья и т.д.
no subject
Date: 2013-06-27 11:09 pm (UTC)Я тоже так думал, когда в школе учился. Позже оказалось, что всё не так (http://ru.wikipedia.org/wiki/%D0%9D%D0%B0%D1%82%D1%83%D1%80%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D1%87%D0%B8%D1%81%D0%BB%D0%BE#.D0.9D.D0.BE.D0.BB.D1.8C_.D0.BA.D0.B0.D0.BA_.D0.BD.D0.B0.D1.82.D1.83.D1.80.D0.B0.D0.BB.D1.8C.D0.BD.D0.BE.D0.B5_.D1.87.D0.B8.D1.81.D0.BB.D0.BE).
(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2013-06-27 06:25 pm (UTC)no subject
Date: 2013-06-27 06:25 pm (UTC)Но город рос-рос, дома становились более-менее похожими. И его потомки стали говорить проще - "мы живем в крайнем доме". А еще пару веков позже, когда кому-то пришла идея нумеровать дома, то потомки говорили "Мы живем в первом доме по улице Могучих Сусликов". Так и повелось. А слово "первый" обозначается на письме цифрой "1". Вот и весь сказ.
А вот другой человек собрал компьютер. Сначала было несколько просто ячеек памяти. Складывал там, вычитал, умножал... Компьютеры совершенствовались, и понадобилось уже составлять списки. А это уже много ячеек памяти. Ну, память-то расширили - проблема не очень большая.
А как бы извлечь нужное число, подумал человек? Ячейки-то тупо нумерованные, от такого-то номера до какого-то еще. Подряд.
И придумал! Ввел т.н. "индекс". И список обозначался как-то так: M,I. Здесь "M" - номер ячейки, где находится первый элемент списка, а "I" - индекс. То есть номер элемента в списке.
И придумал этот человек правило: если мы нашли (вычислили или ввели с перфокарты) элемент списка с номером "I", то записываем его в ячейку с номером M+I. Соответственно, первый элемент записан в M, и ему соответствует номер (индекс) I=0.
Вот она и нумерация с нуля. Собственно, чтобы не путаться, заодно и сами ячейки нумеровали с нуля.
no subject
Date: 2013-06-27 06:29 pm (UTC)Изначальные компьютеры были двоичными. Поэтому числа писались, как ряд лампочек, которые, при прибавлении единицы загорались по правилу: если крайняя справа лампочка не горит, то включить ее и отрапортовать о законченной операции. Если горит, то выключить ее и перейти к следующей лампочке, где идем по тому же правилу.
А в начальный момент лампочки не горят вообще - а это по определению ноль. Потоооом только появляется единица. Так что комп считает с нуля.
(no subject)
From:(no subject)
From:no subject
Date: 2013-06-27 06:30 pm (UTC)no subject
Date: 2013-06-27 07:26 pm (UTC)(no subject)
From:no subject
Date: 2013-06-27 06:40 pm (UTC)Но некоторая сложность все таки была бы. Сейчас в компьютерах памяти как правило меньше максимума (например, стоит 2Gb хотя вся система может и 64Gb поддерживать), а раньше это ограничение было критичным, во время 286ых например. Оно имеет "физическую" природу - количество бит шины адреса. Ну и сейчас, наверное, кто-то мучается с тем что больше 64G не лезет.
Соответственно, и адресация должна имеет столько же бит, сколько шина адреса. Можно больше, но это нерациональный расход памяти.
Так вот, если переменная-указатель, содержит значение 0, то как называть, чему оно равно? единице, а 1 равно двойке? :-)
Поэтому для адресации памяти, как-то все таки проще с нуля начинать.
no subject
Date: 2013-06-27 07:16 pm (UTC)принцип такой - имеем какую то структуру данных располагающуюся по адресу ХХХХ, для простоты путь будут байты, соответсвенно первый байт будет находится по этому адресу со смещением 0, второй - со смещением 1 и т.д., логично же ?
так работают команды на самом низком уровне - уровне ассемблера, загружаем адрес в регистр и просто "щелкаем" смещением, команды процессора (например всех х86, начиная с 8086) напрямую это поддерживают, и это так же отобразили на уровне С++ и прочих языков
(no subject)
From:(no subject)
From:no subject
Date: 2013-06-27 06:49 pm (UTC)no subject
Date: 2013-06-27 07:16 pm (UTC)Логично.
no subject
Date: 2013-06-27 07:48 pm (UTC)А иногда и не начинается: где находится дом 1 на Пенсильвания-авеню?
no subject
Date: 2013-06-27 08:06 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2013-06-27 07:58 pm (UTC)no subject
Date: 2013-06-27 09:44 pm (UTC)Тогда такой науки еще не было.
А работаю я программистом...
И постоянно натыкаюсь на эту проблему - первый элемент массива имеет индекс 0.
От этого куча неудобств.
(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2013-06-27 08:49 pm (UTC)А ноль когда придумали?
no subject
Date: 2013-06-27 10:22 pm (UTC)no subject
Date: 2013-06-27 10:57 pm (UTC)Вот Вы выше написали, что Вы — программист. OK, тогда поясню на близком Вам примере. Допустим, Вы получили пакет из трех байт. Первый байт имеет смещение 0 (от начала пакета, то есть от этого же первого байта), второй байт — смещение 1, третий — смещение 2. Обратите внимание, тут мы считаем байты по порядку от единицы (первый, второй, etc.) если упоминаем порядковый номер в привычном нам натуральном счете, но если будем иметь в виду смещение каждого байта, тогда начнем их же перечислять с нуля.
Нумерация же домов обычно идет с единицы, так как так сложилось исторически. Преимущество такого подхода в том, что нет возможной путаницы при устном и письменном упоминании номеров домов, то есть первый дом, и дом N1 — это обычно один и тот же дом. То есть и в одном случае у нас единица («первый» == 1), и в другом (N1), это удобно. Впрочем, кое-где и с нуля улицы нумеруют. Подробности — в Википедии. (http://ru.wikipedia.org/wiki/%D0%9D%D1%83%D0%BC%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B4%D0%BE%D0%BC%D0%BE%D0%B2)
no subject
Date: 2013-06-28 12:28 am (UTC)no subject
Date: 2013-06-28 12:41 am (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2013-06-28 01:57 am (UTC)no subject
Date: 2013-06-28 02:12 am (UTC)(no subject)
From:(no subject)
From:no subject
Date: 2013-06-28 02:19 am (UTC)http://www.cccambridge.org/
(Посмотрите, там внизу написан их адрес).
no subject
Date: 2013-06-28 06:10 am (UTC)no subject
Date: 2013-06-28 07:28 am (UTC)ПЕРВЫЙ элемент массива - обозначается в компьютере индексом 0. И в этом нет противоречия.
no subject
Date: 2013-06-28 09:34 am (UTC)Счет с 0 в массивах в СИ и ассемблере имеет техническую природу. Разумеется, первая ячейка памяти идет с офсетом 0, и механизм обращения к элементу массива тупо проще, если нумеровать с 0. Но в других местах это вылазит в осложнение. Если у нас есть N объектов, то для обращения к ним в массиве надо перечислять индексы с 0 до N-1. Лишний гемморой для программиста, а вызвано всего лишь желанием оптимизировать процессы и память на самом компьютере.
no subject
Date: 2013-06-28 09:35 am (UTC)А для меня есть.
Адрес первой ячейки памяти в компьютере 0.
А точно такой же адрес первого дома на улице - 1.
И дом и ячейка памяти - физические объекты.
Отсюда и вопрос.
no subject
Date: 2013-06-28 09:50 am (UTC)no subject
Date: 2013-06-28 09:55 am (UTC)И все беды от того, что в этих арифметиках разные понятия числа.
В греческой – число – это мера (два ведра, 38 попугаев).
В индийской – число – это просто символ.
Который может обозначать все, что угодно.
В греческой арифметике (не путать с натуральным рядом чисел), нет и не может быть нуля.
Действительно, как может отсутствие одного предмета быть эквивалентно отсутствию другого.
Более того, в греческой арифметике нет и не может быть отрицательных чисел.
Можно, конечно, попытаться объяснить древнему греку, что отрицательное число – это аналог денежного долга.
Но вот объяснить что если долг умножить на долг, то будет отсутствие долга – за это я не возьмусь.
В быту разница арифметик не замечается.
Но вот при программировании постоянно вылезают разные нестыковки.
Вот взять, к примеру, тот же массив из пяти элементов.
Пять – число, нормальное, греческое.
Его я и использую при описании массива.
А вот индекс массива – число индийское.
Поэтому в цикле при обработке этого массива я вынужден писать не «от одного до пяти», а «от нуля до четырех».
Что как минимум напрягает, а то и влечет за собой ошибки.
А нумерация домов – нормальная, греческая, от единицы.
Правда с вкраплениями «индийцев» – домов с номерами 5-а.
no subject
Date: 2013-06-28 11:55 am (UTC)no subject
Date: 2013-06-28 12:20 pm (UTC)