If-Koubou

Защо компютрите се броят от нула?

Защо компютрите се броят от нула? (Как да)


Преброяването от нула е много често срещана практика на много компютърни езици, но защо? Прочетете, докато разглеждаме явлението и защо е толкова широко разпространено.

Днешната сесия за въпроси и отговори ни идва с любезното съдействие на SuperUser - подразделение на Stack Exchange - обединяване на уеб сайтове с въпроси и отговори.

Въпроса

Reader на SuperUser DragonLord е любопитен защо повечето операционни системи и езици за програмиране се броят от нула. Той пише:

Компютрите традиционно съпоставят числови стойности, започващи от нула. Например, масивите в езиците за програмиране, базирани на С, започват от нула.

Какви исторически причини съществуват за това и какви практически предимства се броят от нула, за да се преброи от един?

Защо наистина? Както е широко разпространена практика, със сигурност има практически причини за нейното прилагане.

Отговорът

Сътрудникът на SuperUser Matteo предлага следните данни:

Изброяването на маси от 0 опростява изчисляването на адреса на паметта на всеки елемент.

Ако масив се съхранява на определена позиция в паметта (нарича се адрес), позицията на всеки елемент може да бъде изчислена като

елемент (n) = адрес + n * размер_от елемента 

Ако считате първия елемент за първия, изчислението става

елемент (n) = адрес + (n-1) * размер_от елемента 

Не е огромна разлика, но добавя ненужно изваждане за всеки достъп.

Редактиран за добавяне:

  • Използването на индекса на масива като офсетов не е изискване, а просто навик. Офсетът на първия елемент може да бъде скрит от системата и да бъде взет предвид при разпределянето и посочването на елемент.
  • Dijkstra публикува хартия "Защо номерирането трябва да започне от нула" (pdf), където той обяснява защо започване с 0 е по-добър избор. Започването от нула позволява по-добро представяне на диапазоните.

Ако искате да се вгледате по-дълбоко в отговора, хартията Dijkstra е информативно.

Имате ли нещо, което да добавите към обяснението? Звучи в коментарите. Искате ли да прочетете повече отговори от други потребители на Stack Exchange? Вижте цялата тема на дискусията тук.