web-dev-qa-db-fra.com

Numérotation des mois à base zéro

Certains langages de programmation populaires utilisent la numérotation des mois qui est désactivée par 1 - JavaScript vient à l'esprit, tout comme Java, et si la mémoire est bonne, C en est un autre. J'ai quelques questions:

  • Si vous allez ignorer la numérotation des mois utilisée par les laïcs, alors pourquoi, pour des raisons de cohérence, ignorez également la numérotation jour utilisée par les laïcs et numérotez les jours de chaque mois à partir de 0?
  • Pourquoi est-ce si courant?
  • Quelle idée était-ce en premier lieu?
96
Robert L

L'utilisation de zéro pour commencer le comptage est en fait une astuce d'optimisation des programmeurs d'assemblage. Au lieu d'affecter 1 au registre de comptage, ils ont XOR 'le registre avec lui-même, ce qui était légèrement plus rapide dans les cycles CPU. Cela signifiait que le comptage commencerait par 0 et serait toujours à la longueur des éléments, à l'exclusion du dernier.

En outre, l'utilisation de zéro est également populaire avec l'arithmétique des pointeurs où vous utiliseriez un pointeur de base pointant vers une mémoire allouée, plus un deuxième pointeur qui serait à un décalage de ce pointeur de base. Ici, l'utilisation de la valeur zéro a beaucoup de sens pour pointer le décalage vers la base du bloc de mémoire. (La logique générale du tableau a tendance à être l'adresse de base plus le décalage de la taille d'enregistrement.)

Et les numéros de mois à base zéro? Souvent, de nombreux environnements de programmation calculent les données en nombre de jours depuis certaines données par défaut. Le 31 décembre 1899 est une date populaire, bien qu'il y ait eu beaucoup d'autres dates utilisées comme date de base. Toutes les autres dates sont décalées de cette base et ne seront stockées que sous la forme d'un seul numéro. Les fractions seraient utilisées pour indiquer les heures, les minutes et les secondes, où 0,25 serait 24/4 = 6 heures. Ainsi, pour transformer une date en date réelle, tout ce que l'environnement a à faire est de transformer ce nombre en date réelle.

Cependant, la combinaison de tableaux à base zéro et de valeurs mensuelles à 1 pose un problème. Pour obtenir le nom du mois du mois 9, vous devez obtenir l'élément 8 du tableau des mois. Certains développeurs seraient heureux de diminuer le numéro du mois avant d'obtenir son nom. D'autres ont préféré changer le mois en quelque chose de base zéro car les gens veulent juste connaître le nom, pas le nombre. C'est une vision personnelle.

52
Wim ten Brink

C'est ce que c'est, et le poids énorme des logiciels construits selon cette hypothèse signifie que ça va être là pendant un certain temps.

Mon opinion est que c'était la faute de C, et tous ces autres langages Johnie-come-lately viennent de s'y conformer.

Vous obtenez des situations amusantes de personnes qui ne connaissent pas mieux. L'un des rares bogues de l'an 2000 que notre équipe a trouvé était un site Web proclamant fièrement l'année 19100 simplement parce qu'ils préfixaient le struct tm année avec le littéral "19".

6
paxdiablo

Oui, les Romains ont également eu des problèmes avec zéro.

C'est juste une conséquence [non intuitive] des mathématiques (étant une composante forte de la programmation, en particulier la programmation précoce) définissant zéro comme le premier (terme problématique celui-là) réel, positif* nombre naturel, et comme un tableau est indexé avec des nombres naturels réels, le "premier" élément est à l'index 0.

Les mois sont vraiment des valeurs nommées dans un tableau, où les jours et les années sont des valeurs numérotées - il serait peut-être plus utile de considérer les jours/années comme étant dans des tableaux qui ressemblent à {"1", "2", "3",. ..} eux-mêmes.

Quant à savoir pourquoi cela est si commun (en plus d'être mathématiquement correct), toutes les langues que vous avez répertoriées descendent d'une origine commune pour une chose ...

Éditer:

En y regardant plus loin, ce wikipedia lien détaille plusieurs bonnes raisons intéressantes pour l'indexation zéro (qui ne dit pas directement pourquoi les mois sont indexés zéro mais je pense que cela est déjà couvert), et cela DONC link a déjà répondu à la question.

Il semble que l'opinion dominante soit "accident historique" ou "parce que les mois ne sont pas des chiffres et ne peuvent donc pas être comparés au stockage jour/année" selon la personne à qui vous demandez.

* Désolé, désolé, la physique! = Les maths reviennent me mordre là-bas. En route pour repasser mes mains maintenant.

4
annakata