Numeración de meses de base cero [cerrado]

98

Algunos lenguajes de programación populares usan la numeración de meses, que está desviada en 1; me viene a la mente JavaScript, al igual que Java, y si la memoria funciona, C es otra. Tengo algunas preguntas:

  • Si va a ignorar la numeración de meses utilizada por los laicos, entonces, ¿por qué no, en aras de la coherencia, también ignorar la numeración de días utilizada por los laicos y numerar los días de cada mes comenzando desde 0?
  • ¿Por qué esto es tan común?
  • ¿De quién fue la idea en primer lugar?
Robert L
fuente
¿Arrays, comienzan en 0 y la gente se refiere a los días por números?
glasnt
13
@TomatoSandwich: muy a menudo la gente se refiere a los meses por números y los numera empezando por 1 .
Robert L
2
Por cierto, los programadores de API no son dioses; a veces se cometen errores en las implementaciones; simplemente trata con ello. No es que este sea exactamente un caso (ni siquiera dices en qué idioma), pero no esperes que todo sea perfecto. Sin embargo, admiro querer saber la razón.
Mediodía Silk
5
En Japón, solo usan números. No usan enero, febrero, etc. El mundo occidental también usa números con mucha frecuencia. Espero que nunca vuelvan a hacer otro lenguaje de programación que elija el estilo de matriz sobre el estilo del lenguaje hablado. Es una solución tan simple para algo que se usará millones de veces.
Wolfpack'08
1
De acuerdo, aunque no es una ofensa en la horca, quienquiera que haya hecho esto solo desperdició diez minutos de mi tiempo y merece una bofetada con un pez mojado de tamaño mediano.
James McCormack

Respuestas:

53

El uso de cero para comenzar a contar es en realidad un truco de optimización de los programadores de Ensamblador. En lugar de asignar 1 al registro de conteo, hicieron XOR del registro consigo mismo, que fue un poco más rápido en los ciclos de la CPU. Esto significaba que el conteo comenzaría con 0 y siempre alcanzaría la longitud de los elementos, excluyendo el último.

Además, el uso de cero también es popular en la aritmética de punteros, donde se usaría un puntero base que apunta a alguna memoria asignada, más un segundo puntero que estaría en un desplazamiento de este puntero base. Aquí, usar el valor cero tiene mucho sentido para apuntar el desplazamiento a la base del bloque de memoria. (La lógica de matriz general tiende a ser la dirección base más el desplazamiento x tamaño de registro).

¿Y números de mes basados ​​en cero? A menudo, muchos entornos de programación calculan los datos como un número de días desde algunos datos predeterminados. El 31 de diciembre de 1899 es una fecha popular, aunque se han utilizado muchas otras fechas como fecha base. Todas las demás fechas se compensan con esta base y solo se almacenarán como un solo número. Las fracciones se utilizarían para indicar horas, minutos y segundos, donde 0,25 sería 24/4 = 6 horas. Por lo tanto, para transformar una fecha en una fecha real, todo lo que tiene que hacer el entorno es transformar este número en una fecha real.

Sin embargo, la combinación de matrices de base cero y valores de mes basados ​​en 1 trae un problema. Para obtener el nombre del mes del mes 9, tendría que obtener el elemento 8 de la matriz del mes. Algunos desarrolladores estarían contentos con disminuir el número de meses antes de obtener su nombre. Otros prefirieron cambiar el mes a algo basado en cero, ya que la gente solo quiere saber el nombre, no el número. Es una vista personal.

Wim ten Brink
fuente
92
Los constructores JavaScript y AS3 Date toman valores reales para todo "excepto" el mes, que por una razón desconocida debe especificarse como de base cero. Sin duda, es un diseño de API terrible.
Triynko
3
Estoy de acuerdo. Esto solo me costó una hora tratar de averiguar por qué mi cita estaba dentro de un mes. Realmente no tiene mucho sentido que todo se base en 1 excepto el mes. Desafortunadamente, probablemente no se pueda arreglar, de lo contrario terminaríamos con otro problema del año 2000 :-).
Mike Gold,
1
Tl; dr: Debido a las operaciones de búsqueda array monthName[monthNumber]o mon_name[tm_mon]con notación time.h .
Perseidas
Lo de XOR-consigo mismo es una pista falsa; es una cosa de Intel. Otras MPU tenían otras formas de cero registros; algunos también tenían formas eficientes de establecerlos en 1. La razón principal de las cosas basadas en cero son los cálculos de índices; a veces también son útiles para la aritmética.
alastair
6

Es lo que es, y el enorme peso del software creado bajo esa suposición significa que estará disponible por un tiempo.

Mi opinión es que fue culpa de C, y todos esos otros lenguajes Johnie-come-últimamente simplemente se conformaron con él.

Obtienes algunas situaciones divertidas de personas que no conocen mejor. Uno de los pocos errores del año 2000 que nuestro equipo encontró fue un sitio web que proclamaba con orgullo que el año era 19100 simplemente porque antepusieron el struct tmaño con el literal "19".

paxdiablo
fuente
Al menos una persona (no yo) había definido las funciones "getRealMonth" y "setRealMonth" para su uso en sus scripts. No lo culpo ni un poco.
Robert L
1
Voto a favor de la referencia del error Y2K.
Justus Romijn
4

Sí, los romanos también tuvieron problemas con el cero.

Esto es solo una consecuencia [no intuitiva] de las matemáticas (siendo un componente fuerte de la programación, especialmente la programación temprana) que define cero como el primer (término problemático ese uno) número real, positivo * natural, y dado que una matriz está indexada con real , números naturales, el "primer" elemento está en el índice 0.

Los meses son realmente valores con nombre en una matriz, donde los días y los años son valores numerados; quizás sería más útil pensar en los días / años como en matrices que se parecen a {"1", "2", "3",. ..} ellos mismos.

En cuanto a por qué esto es tan común (además de ser matemáticamente correcto) bueno, todos los idiomas que enumeró descienden de un origen común para una cosa ...

Editar:

Mirándolo más a fondo, este enlace de wikipedia detalla varias razones buenas e interesantes para la indexación cero (que no habla directamente de por qué los meses tienen indexación cero, pero creo que ya está cubierto), y este enlace SO ha respondido la pregunta antes.

Parece que la opinión predominante es "accidente histórico" o "porque los meses no son números, por lo que no se pueden comparar con el almacenamiento de día / año", según a quién le pregunte.

* Lo siento, lo siento, la física! = Las matemáticas vuelven a morderme allí. Me voy a planchar las manos ahora.

Annakata
fuente
5
El cero no es un número positivo. Tampoco es un número negativo.
Robert L
Buen punto, quizás debería cambiarlo a "número natural".
paxdiablo
1
Interesante, siempre había pensado que las matrices C comienzan en 0 para simplificar la aritmética del puntero: a[0]== *(a + 0).
demasiado php
2
En realidad, en computación, puede tener un cero positivo y negativo si usa el sistema de complemento de unos. Afortunadamente, ese sistema casi nunca se vuelve a utilizar. Ver en.wikipedia.org/wiki/Ones'_complement#Ones.27_complement
Wim ten Brink
El mes también es un número, al igual que el día en nuestra cultura. El primer mes de un año se llama realmente "1 (st) mes", y el último se llama "12 (th) mes"
Michael Tsang