56 votes

Pourquoi les ordinateurs comptent-ils à partir de zéro?

Les ordinateurs effectuent traditionnellement le décompte des valeurs numériques à partir de zéro. Par exemple, les tableaux dans les langages de programmation basés sur C commencent à partir de l'indice zéro.

Quelles sont les raisons historiques de cela, et quels avantages pratiques le fait de compter à partir de zéro a-t-il par rapport à compter à partir de un?

Remarque : Cette question demande des réponses techniques bien expliquées, pas seulement des opinions, et vise à couvrir les ordinateurs en général plutôt que simplement la programmation. Cette question fait suite à la question des Programmeurs "Pourquoi les structures/tableaux commencent-ils à zéro?".

19 votes

3 votes

Parce que les ordinateurs utilisent un système numérique en base 2.

9 votes

Il y a eu plus de quelques exemples de langages informatiques qui utilisaient des tableaux d'origine 1.

90voto

Edu Points 1053

Compter les tableaux à partir de 0 simplifie le calcul de l'adresse mémoire de chaque élément.

Si un tableau est stocké à une position donnée en mémoire (appelée adresse), la position de chaque élément peut être calculée comme suit

élément(n) = adresse + n * taille_de_l'élément

Si vous considérez le premier élément comme étant le premier, le calcul devient

élément(n) = adresse + (n-1) * taille_de_l'élément

Ce n'est pas une énorme différence mais cela ajoute une soustraction inutile à chaque accès.

Modifier

  • L'utilisation de l'index du tableau comme un décalage n'est pas une obligation mais seulement une habitude. Le décalage du premier élément pourrait être caché par le système et pris en compte lors de l'allocation et de la référence des éléments.

  • Dijkstra a publié un article "Pourquoi le numérotage devrait commencer à zéro" (pdf) où il explique pourquoi commencer par 0 est un meilleur choix. Commencer à zéro permet une meilleure représentation des plages.

8 votes

+1 for correct answer. Note that 0-based indexing is just a (très commun) convention of the language being used; it's not universal. For instance, Lua utilise un indexage basé sur 1. L' "soustraction inutile" pourrait avoir été la raison derrière l'indexation basée sur 0 dans le passé, mais maintenant la plupart des langages l'utilisent simplement car c'est ce à quoi tout le monde est déjà habitué (largement grâce à C), et il n'y a aucune raison convaincante de changer cette convention.

3 votes

Cela n'a aucun sens. La position de chaque élément peut toujours être calculée comme adresse + n * taille_de_l_element tant que "adresse" est l'adresse de l'élément zéro. Cela fonctionne parfaitement que l'élément zéro existe en tant qu'élément du tableau ou non. La question est pourquoi l'élément zéro existe, pas pourquoi nous stockons les adresses comme l'adresse de l'élément zéro (éventuellement notionnel). (Ce à quoi cela répond.)

0 votes

@DavidSchwartz Bien sûr, mais dans ce cas, le zéro élément ne sera pas adressable. Si votre tableau commence à 1, vous n'utiliserez jamais le zéro élément.

37voto

Pat Osterday Points 151

Alors que les principes ci-dessous s'appliquent aux décimales comme à toute autre base, compter à partir de 0 dans les ordinateurs peut être facilement compris naturellement à partir du système binaire à chiffres fixes de représentation des nombres utilisé dans les ordinateurs. Si vous avez 8 bits, alors il y a 256 combinaisons possibles de 1 et de 0 qui peuvent être exprimées. Vous pourriez utiliser ces 8 bits pour exprimer les nombres 1-256, mais cela exclurait le 0 qui est utile en mathématiques en tant que nombre en soi, donc ils sont utilisés pour exprimer les nombres 0-255.

Cela établit déjà un précédent d'un ordre naturel commençant par 0 (tous les 0 dans la représentation binaire) à 255 (tous les 1 dans un nombre sur 8 bits). En considérant le système de représentation des nombres, commencer par 0 a du sens car 0 est le "premier" nombre dans le système, donc 1 est le "deuxième" nombre, et ainsi de suite.

Une autre raison pour laquelle commencer par 0 dans les ordinateurs est si pratique est due au concept de décalages. Un décalage est un numéro représentant la distance d'un emplacement dans la mémoire ou le disque dur ou tout autre support "adressable". Dans les ordinateurs, pratiquement toutes les données sont stockées linéairement, ce qui signifie qu'il y a un ordre aux données, un premier octet, un deuxième octet, etc. Il est pratique d'exprimer l'emplacement des "zones" de données via un décalage. Quel est le premier octet dans un bloc de données ? Il est à un décalage de '0', ce qui signifie qu'il est trouvé 0 octets après le premier octet dans le bloc de données. Alors qu'il est possible de désigner le premier octet par "1", cela crée des complications dans la représentation des données pour plusieurs raisons:

  • En excluant l'utilisation de 0 pour adresser des données, vous réduisez le nombre de choses auxquelles vous pouvez accéder avec un nombre sur 8 bits de un.
  • Pour calculer le décalage, qui est nécessaire au niveau matériel de l'accès aux données, à un moment donné vous devez soustraire un du numéro, ce qui introduit une complexité.
  • Les pointeurs vers un bloc de données pointent toujours vers le premier bloc, donc l'arithmétique est simple lorsque vous commencez à partir de 0. Par exemple, le premier octet dans le premier bloc du premier cluster de données est 0 + 0 + 0 lorsque vous commencez à partir de 0, tandis qu'il est 1 + 1 + 1 - 1 - 1 lorsque vous commencez à partir de 1. L'arithmétique pour cela lorsque vous commencez à partir de 1 avec des structures de données imbriquées comme cet exemple peut être déroutante.

0 votes

Je peux voir à partir de 0 quand il n'y a rien, j'aimerais que quelqu'un puisse expliquer pourquoi le 1er disque est 0, alors qu'il est maintenant 1 disque. Retournez et nommez la 1ère partition 1, alors qu'elle commence à zéro (0). Je pourrais comprendre pourquoi le premier IP distribué serait 0, car cela pourrait identifier le serveur/maître et le reste pourrait être numéroté, alors pourquoi cela commence-t-il à 1? Dans un éditeur hexadécimal, le 1er morceau est 0, mais il y a presque toujours 1 quelque chose là-bas, mais dans un éditeur de texte, le compte des caractères est de 0 quand il n'y en a pas. Je pense que des humains sont impliqués, surtout quand ils essaient de diviser par 0 + crash +

31 votes

N'a rien à voir avec la représentation binaire. Les nombres binaires et décimaux commencent tous deux à partir de 0.

2 votes

Si vous commencez à compter à partir de 0, vous ne réduisez pas le nombre d'adresses que vous pourriez (en théorie) passer de 1 à 257.

27voto

Je n'aurais jamais pensé qu'une opportunité pour un philosophe de fauteuil comme moi viendrait sur Superutilisateur. Il y a ici une idée fondamentale erronée, car les non-philosophes ont tendance à sauter les détails minutieux. En bref : Les ordinateurs ne comptent pas à partir de zéro, mais la dénomination des positions commence à zéro.

Il n'y a rien de confus dans cette incohérence perçue entre les techniques de comptage des ordinateurs et des humains (quelconques). Analysons la question.

Pourquoi les ordinateurs comptent-ils à partir de zéro ?

  • Ils ne comptent pas à partir de zéro

Les ordinateurs totalisent des valeurs à partir de zéro. Par exemple, les tableaux en C.

  • L' index (indicateur de position, total) commence à zéro. Le compte des éléments dans un tableau où il y a un seul élément à l'index zéro est de un

Le zéro est pratique pour représenter un vide ou le point médian d'une échelle. Il n'est pas pratique pour compter quoi que ce soit car c'est impossible par définition de zéro.

De la même manière que le point médian d'une échelle, le zéro peut être utilisé pour représenter le bord même (début absolu) d'une collection. La question est sans signification parce qu'elle est inconsistante entre "totaliser des valeurs" et "compter à partir de zéro".

Donc oui, les ordinateurs totalisent à partir de zéro, mais ils comptent à partir de un. Les deux mots ont des significations différentes.

tal·ly [tal-ee]

nom

  1. un compte ou une réckoning; un enregistrement de débit et de crédit, du score d'un jeu, ou autre.
  2. quelque chose sur quoi un score ou un compte est conservé.
  3. un numéro ou un groupe d'éléments enregistrés.

count [kount]

verbe (utilisé avec objet)

  1. vérifier (les unités ou groupes séparés d'une collection) un par un pour déterminer le nombre total; ajouter; énumérer : Il a compté ses billets et a trouvé qu'il en avait dix.
  2. calculer; compter; calculer.
  3. énumérer ou nommer les chiffres jusqu'à : Fermez les yeux et comptez jusqu'à dix.

(dictionary.com)


Les raisons pratiques sont adéquatement décrites par Dougvj, je n'ai rien à ajouter à ce sujet. Si seulement nous pouvions avoir un professeur d'informatique (des années 60) pour donner un compte rendu historique...

0 votes

En réalité, comment savez-vous où l'ordinateur commence quelque chose? Tout ce que vous savez, c'est que lorsque vous l'utilisez, vous lui DITES de commencer à partir de zéro.

0 votes

Je parle ici des définitions de concepts et de logique, pas de la façon dont fonctionnent les ordinateurs en soi. Je sais un peu d'où les ordinateurs commencent à cause des cours de CS que j'ai suivis.

1 votes

Pour être complètement pointilleux, tu compares un verbe avec un nom. Je pense que "tally" et "count" sont vraiment synonymes, et les deux peuvent être utilisés comme un verbe ou un nom.

13voto

NevilleDNZ Points 221

Je pense que ceci a déjà été couvert précédemment par "prof.dr. Edsger W. Dijkstra" - Burroughs Research Fellow dans une lettre datée du 11 août 1982 : voir EWD831

Intitulé : Pourquoi la numérotation devrait commencer à zéro. "Y a-t-il des raisons de préférer une convention à une autre ? Oui, il y en a...."

Notez également que Dijkstra faisait partie de l'équipe de conception d' ALGOL 68 jusqu'en 1968. Algol68 permet des tableaux à partir de 0, 1 ou de tout autre nombre que le programmeur juge approprié pour l'algorithme. voir ("La création d'Algol 68" raconte ' “Pouvez-vous définir des tableaux triangulaires ?” quelqu'un (Tony Hoare ?) interrompit. “Pas seulement triangulaire, mais même elliptique” répondit Aad, et montra comment. ')

Plus précisément, en Algol68, lorsque les tableaux (et les matrices) sont tranchés, ils obtiennent un index @1, ce qui favorise les tableaux [1:...]. Mais le premier indice peut être déplacé pour commencer à la position "0" en spécifiant "@0", par exemple vecteur x[4:99@2], matrice y[4:99@1,4:99@0]. De même, il y a un défaut/favoritisme de 1 dans les boucles de ~ à (à moins que "à partir de 0" ne soit explicitement indiqué), et d'1 pour les cas entiers case i dans ~,~,~ fin de cas et des clauses de choix $c(~,~,~)$ choice.

Il semble que les commentaires de Dijkstra sur le Rapport de Mars 1968 (MR93 ) et ses insistance aient provoqué ce qui est probablement une pré-usenet guerre de mots : "il existe des écrits qui sont aimables bien qu'ils soient incorrects, et il y a d'autres écrits qui sont extrêmement corrects, mais qui sont dégoûtants. C'est quelque chose que je ne peux expliquer à des personnes superficielles." EWD230

Le Rapport Final d'Algol 68(RF) est sorti le 20 décembre 1968 lorsqu'il a été présenté à la Réunion de Munich puis adopté par le Groupe de Travail. Ensuite, le rapport a été approuvé par l'Assemblée Générale de l'UNESCO IFIP pour publication.

Aux alentours du 23 décembre (?) 1968 Dijkstra, Duncan, Garwick, Hoare, Randell, Seegmuller, Turski, Woodger et Garwick ont signé le AB31.1.1.1 "Minority Report", page 7 (Publié en 1970).

10voto

Random832 Points 621

L'analogie de la distance que quelqu'un d'autre a évoquée se prête à une illustration très pratique :

"À quelle distance se trouve votre maison de la station-service la plus proche ?"

"1 mile."

"Tu vis à la station-service ?"

"Non, si je vivais à la station-service, ce serait 0 miles"

"Pourquoi comptez-vous à partir de zéro au lieu de un ?"

Un autre bon exemple serait les anniversaires - nous ne disons pas que quelqu'un a un an le jour de sa naissance, nous disons que c'est un an plus tard.

Nous disons que les années bissextiles ou les élections présidentielles aux États-Unis ont lieu tous les quatre ans, même si si on compte à partir de un : 2000, 2001, 2002, 2003, 2004 font cinq ans. (Soit dit en passant, les Romains ont un temps fait ça incorrectement, en programmant des années bissextiles trop rapprochées)

Mon point est que nous "comptons" à partir de zéro tout le temps dans le monde réel - "Combien de positions après [le début de l'array] se trouve l'élément que vous voulez" est simplement la question à laquelle vous répondez en comptant à partir de zéro dans de nombreux programmes informatiques. Vous ne diriez pas que le premier élément est une position après le début, n'est-ce pas ? C'est le début.

1 votes

Votre calcul concernant les élections est erroné d'un an. Votre exemple contient 2 années électorales dans un intervalle de 5 ans; l'illustration correcte serait que 4 ans se passent d'une élection à l'autre, c'est-à-dire 2000 -> 2001 (un intervalle d'1 an), 2001 -> 2002, 2002 -> 2003, 2003 -> 2004.

1 votes

@Jimmy C'était mon point - si les gens "comptaient à partir de un" dans le sens où ils veulent que les ordinateurs le fassent, ils compteraient 2000 comme un au lieu de zéro. C'est, incidemment, comment les anciens Romains le faisaient réellement (et décriraient en effet un cycle comme "2000, 2004, 2008" comme un cycle de cinq ans).

3 votes

Votre exemple de date de naissance n'est pas universellement vrai. Par exemple, en Corée du Sud, la première année de vie est comptée comme un au lieu de zéro.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X