[date] 0 기반 월 번호 매기기 [닫기]

일부 인기있는 프로그래밍 언어는 월 번호 매기기를 사용합니다. 이는 1에서 벗어난 월 번호를 사용합니다. 자바와 마찬가지로 자바 스크립트가 떠오르며 메모리가 사용되는 경우 C는 다른 것입니다. 질문이 몇 개 있습니다:

  • 평신도들이 사용하는 월 번호를 무시하려면 일관성을 위해 그날 도 무시하지 않는 이유는 무엇입니까? 평신도가 사용 번호를 매월 0부터 시작 번호를 지정 무엇입니까?
  • 왜 그렇게 흔한가요?
  • 처음에 이것은 누구의 생각 이었습니까?


답변

계산을 시작하기 위해 0을 사용하는 것은 실제로 어셈블리 프로그래머의 최적화 트릭입니다. 카운트 레지스터에 1을 할당하는 대신 레지스터 자체를 XOR하여 CPU주기에서 약간 더 빠릅니다. 이것은 계산이 0으로 시작하고 항상 마지막 요소를 제외한 요소의 길이까지임을 의미합니다.

또한 0의 사용은 할당 된 메모리를 가리키는 하나의 기본 포인터와이 기본 포인터의 오프셋에있는 두 번째 포인터를 사용하는 포인터 산술에서도 널리 사용됩니다. 여기서 값 0을 사용하면 오프셋을 메모리 블록의 기준으로 지정하는 것이 좋습니다. (일반 배열 논리는 기본 주소에 오프셋 x 레코드 크기를 더한 경향이 있습니다.)

그리고 0부터 시작하는 월 숫자? 종종 많은 프로그래밍 환경에서 일부 기본 데이터 이후 날짜 수로 데이터를 계산합니다. 1899 년 12 월 31 일이 인기있는 날짜이지만 기준 날짜로 사용되는 다른 날짜가 많이 있습니다. 다른 모든 날짜는이 기준에서 오프셋되며 하나의 단일 숫자로 저장됩니다. 분수는 시간, 분, 초를 나타내는 데 사용되며 0.25는 24/4 = 6 시간입니다. 따라서 날짜를 실제 날짜로 변환하려면 모든 환경에서이 숫자를 실제 날짜로 변환해야합니다.

그러나 0부터 시작하는 배열과 1부터 시작하는 월 값을 함께 사용하면 문제가 발생합니다. 월 9의 월 이름을 얻으려면 월 배열에서 항목 8을 가져와야합니다. 일부 개발자는 이름을 얻기 전에 월 수를 줄이는 것에 만족할 것입니다. 다른 사람들은 사람들이 숫자가 아닌 이름 만 알고 싶어하기 때문에 월을 0 기반으로 변경하는 것을 선호했습니다. 그것은 개인적인 견해입니다.


답변

그것은 그것이 무엇이며, 그 가정에 따라 만들어진 거대한 소프트웨어의 무게는 그것이 잠시 동안 주변에있을 것이라는 것을 의미합니다.

의견 은 그것이 C의 잘못이고, Johnie가 최근에 온 다른 모든 언어가 그것을 준수했다는 것입니다.

당신은 더 잘 모르는 사람들로부터 재미있는 상황을 얻습니다. 우리 팀이 발견 한 몇 안되는 Y2K 버그 중 하나는 그 struct tm해를 문자 그대로 “19”로 시작했기 때문에 19100 년이라는 자랑스럽게 선언하는 웹 사이트였습니다 .


답변

예, 로마인도 제로 문제가있었습니다.

이것은 수학 (프로그래밍, 특히 초기 프로그래밍의 강력한 구성 요소)이 0을 실수, 양수 * 자연수 로 정의하는 수학의 [비 직관적] 결과 일 뿐이며 배열은 실수로 인덱싱되기 때문입니다. , 자연수 “첫 번째”요소는 인덱스 0에 있습니다.

월은 실제로 배열에서 이름이 지정된 값입니다. 여기서 일과 연도는 번호가 매겨진 값입니다. 일 / 년을 { “1”, “2”, “3”,처럼 보이는 배열로 생각하는 것이 더 유용 할 것입니다. ..} 자신.

이것이 수학적으로 정확하다는 것을 제외하고 이것이 왜 그렇게 흔한 지에 관해서는 당신이 나열한 모든 언어가 한 가지 공통의 기원에서 유래했습니다 …

편집하다:

더 자세히 살펴보면,이 위키피디아 링크는 제로 인덱싱에 대한 몇 가지 좋고 흥미로운 이유를 자세히 설명합니다 (이는 월이 제로 인덱싱되는 이유를 직접적으로 설명하지는 않지만 이미 다루어 졌다고 생각합니다).이 SO 링크는 이전에 질문에 답했습니다.

일반적인 의견은 “역사적 사고”또는 “달이 숫자가 아니기 때문에 일 / 년 저장과 비교할 수 없기 때문”입니다.

* 미안 해요, 미안 해요, 물리학! 이제 내 손을 다림질해라.


답변