2009-09-21 19 views
89

Algunos lenguajes de programación populares utilizan la numeración de los meses, que está desactivada en 1 - JavaScript viene a la mente, al igual que Java, y si la memoria sirve, C es otra. Tengo algunas preguntas:Numeración de meses basada en cero

  • Si va a estar ignorando la numeración meses utilizado por los laicos, entonces ¿por qué no por el bien de la consistencia también ignorar el numeración día utilizado por los laicos, y el número de los días en cada mes comenzando desde 0?
  • ¿Por qué es esto tan común?
  • ¿De quién fue esta idea en primer lugar?
+0

Las matrices, comienzan en 0, y las personas se refieren a los días por números? – glasnt

+10

@TomatoSandwich: con mucha frecuencia las personas se refieren a _months_ por números, y los numeran a partir de _1_. –

+2

API Los programadores no son dioses por cierto; a veces los errores entran en las implementaciones; simplemente trata con ello. No es que sea exactamente un caso (ni siquiera dices qué idioma), pero no esperes que todo sea perfecto. Aunque admiro querer saber la razón. –

Respuesta

48

El uso de cero para comenzar a contar es en realidad un truco de optimización de los programadores de ensamblado. En lugar de asignar 1 al registro de recuento, se XOR'ed el registro consigo mismo, que fue ligeramente más rápido en los ciclos de la CPU. Esto significaba que el conteo comenzaría con 0 y siempre estaría a la altura de los elementos, excluyendo el último.

Además, el uso de cero también es popular con aritmética de puntero en la que usaría un puntero de base apuntando a alguna memoria asignada, más un segundo puntero que estaría en un desplazamiento desde este puntero de 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 tamaño de registro x de compensación).

¿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 desde esta base, y solo se almacenarán como un solo número. Las fracciones se usarí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 el entorno tiene que hacer es transformar este número en una fecha real.

Sin embargo, la combinación de matrices basadas en cero y valores de mes basados ​​en 1 genera un problema. Para obtener el nombre del mes del mes 9, debe obtener el elemento 8 de la matriz del mes. Algunos desarrolladores estarían felices de disminuir el número del mes 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 visión personal.

+79

Los constructores de fecha de JavaScript y AS3 toman valores reales para todo "excepto" el mes, que por un motivo desconocido debe especificarse como basado en cero. . Sin duda, es un terrible diseño de API. – Triynko

+3

Estoy de acuerdo. Esto me costó una hora tratando de descubrir por qué mi cita era un mes. Realmente no tiene mucho sentido que todo esté basado en 1, excepto por el mes. Desafortunadamente, es probable que no se pueda corregir, de lo contrario terminaríamos con otro problema de Y2K :-). –

+1

Tl; dr: debido a la búsqueda de matriz 'monthName [monthNumber]' o 'mon_name [tm_mon]' con [time.h notation] (http://www.cplusplus.com/reference/ctime/asctime/). – Perseids

4

Es lo que es, y el gran peso del software construido para esa suposición significa que va a estar por un tiempo.

Mi opinión es que fue por culpa de C, y todos esos otros lenguajes de Johnie-coming-recent se conformaron con eso.

Obtiene algunas situaciones divertidas de personas que no saben nada. Uno de los pocos errores de Y2K que nuestro equipo encontró fue un sitio web que proclamaba con orgullo que el año era 19100 simplemente porque prefiguraban el año struct tm con el literal "19".

+0

Al menos una persona (no yo) había definido las funciones "getRealMonth" y "setRealMonth" para usar en sus scripts. No lo culpo ni un poco. –

+1

Votación hacia arriba para la referencia de error Y2K. –

4

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

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

Los meses son valores realmente nombrados en una matriz, donde días y años son valores numerados, tal vez sería más útil pensar de días/años como en arreglos que se parecen a {"1", "2", "3", ...} ellos mismos.

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

Editar:

Mirando más en él, Este enlace wikipedia detalla varias razones buenas e interesantes para la indexación cero (que no habla directamente de por qué los meses tienen índice cero pero creo que eso ya está cubierto), y este enlace SO ha respondido la pregunta anteriormente.

Parece que la opinión prevaleciente 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" dependiendo de a quién se lo pregunte.

* Lo siento, lo siento, la física! = Las matemáticas vuelven para morderme allí. Fuera para planchar mis manos ahora.

+5

Cero no es un número positivo. Tampoco es un número negativo. –

+0

Buen punto, tal vez debería cambiarlo a "número natural". – paxdiablo

+1

Interesante, siempre he pensado que las matrices C comienzan en 0 para simplificar la aritmética del puntero: 'a [0]' == '* (a + 0)'. –