Warum zählen Computer von Null?

10273
bwDraco

Computer zählen üblicherweise numerische Werte beginnend bei Null. Zum Beispiel beginnen Arrays in C-basierten Programmiersprachen mit dem Index Null.

Welche historischen Gründe gibt es dafür und welche praktischen Vorteile hat das Zählen von Null gegenüber dem Zählen von Eins?

Hinweis: Diese Frage verlangt nach gut erklärten technischen Antworten, nicht nur nach Meinungen, sondern bezieht sich auf Computer im Allgemeinen und nicht nur auf das Programmieren. Diese Frage erweitert die Frage des Programmierers "Warum sind Strukturen / Arrays nullbasiert?" .

55
[Djkstra-Stellungnahme] (http://www.cs.utexas.edu/users/EWD/ewd08xx/EWD831.PDF) Bakuriu vor 11 Jahren 16
Weil Computer ein numerisches Basis-2-System verwenden. Ramhound vor 11 Jahren 3
Es gab mehr als einige Beispiele für Computersprachen, die 1-Origin-Arrays verwendeten. Daniel R Hicks vor 11 Jahren 9
(Und Computer, die dezimal, oktal, 3s, 100s usw. zählen) Daniel R Hicks vor 11 Jahren 1
Ich hoffe, DL fragt nicht nach Fließkomma- und Rundungsfehlern. Psycogeek vor 11 Jahren 1
Warum zählen Menschen nicht von 0? Untitled vor 11 Jahren 23
@Untitled Definitiv einverstanden. Die erste natürliche Zahl ist Null, da es völlig akzeptabel ist, null Dinge in der Realität zu haben. Und Operationen werden vereinfacht. Alba Mendez vor 11 Jahren 0
Woah, woah, niemand zählt von Null, wir * indexieren * von Null. Niemand sagt das "nullte" Element. Wir sagen das "erste" Element bei * index * 0. Denken Sie an den Index, wie weit ein Element von der ersten Position versetzt ist. Nun, das erste Element befindet sich an der ersten Position, es ist also überhaupt kein Versatz, daher ist der Index 0. Das zweite Element ist ein Element vor ihm, also ist es ein Versatz von 1 Element und befindet sich am Index 1 mowwwalker vor 11 Jahren 46
Aus demselben Grund sind die Jahre des 20. Jahrhunderts alle in der Form 19xx. Im 1. Jahrhundert waren die "Tausend" - und "Hundert" -Säule alle Null. Im ersten Jahrzehnt waren es auch die "Zehner". Während das erste Jahr als "Jahr 1" bezeichnet werden kann, beginnt es an _Position_ Null. Stewart vor 11 Jahren 4
@Ramhound Nein, ist es nicht. Die nullbasierte Indizierung hat nichts mit der Verwendung von binär zu tun. Peter Olson vor 11 Jahren 14
Vor Computern gab es Mathematik. In der Mathematik fangen die Dinge bei 0 an. Mein abstrakter Algebra-Lehrer würde sagen, dass die Uhr eine 0 anstatt einer 12 haben sollte, da es sich um eine Mod 12-Schnittstelle handelt. avgbody vor 11 Jahren 4
@ PeterOlson - Ich stimme dir nicht zu. Ramhound vor 11 Jahren 0
@Untitled: Wir * zählen * von 0 aus. Wenn Sie einen Artikel haben, werden wir auf 1 gesetzt. Bevor wir einen Artikel hatten, hatten wir 0. Der Hochstapler vor 11 Jahren 2
@Walkerneo Genau. Oliver Salzburg: Vor dem ersten Element war nichts zu zählen. Ярослав Рахматуллин vor 11 Jahren 0
Humans do count from zero. How many fingers am I holding up? (Closed fist). Zero. To count, you start from zero. Then, if any items or events of interest occur, you increment once for each of them. The resulting value is the count. Counting must include the possibility that nothing is counted, otherwise it is broken. Kaz vor 11 Jahren 0
Peanos axioms simply state that the set of natural numbers has an element he called "one" such that there does not exist any natural number n such that the successor of n is one. You can choose which symbol to represent the "one" element at will. If you wish it can be -10 or the letter 'a'. emory vor 11 Jahren 0
Hier ist eine weitere Dummheit, mit freundlicher Genehmigung von Musikern (betrunkenes Los). Eine Skala mit sieben Tönen nennt man eine Oktave! Sicher, lassen Sie uns C zweimal zählen, warum nicht wir. Okay, wir haben bisher sieben und acht. Dann basieren die Intervalle auf Eins, also haben wir eine Neun-Regel für die Invertierung: Invertieren Sie eine dritte und Sie erhalten (9 - 3) die Sechste. Yay! Drei Zahlen, um mit etwas Einfacherem umzugehen. Unter nullbasierten Intervallen haben wir Septaven (oder Heptaven). Ein Intervall wird invertiert, indem von 7 subtrahiert wird. Sieben Noten, Septave, Regel von sieben. Kaz vor 11 Jahren 0
I am reminded that the IBM 650, a relatively popular early computer, used [bi-quinary](http://en.wikipedia.org/wiki/Bi-quinary_coded_decimal) data storage. Think abacus. Daniel R Hicks vor 11 Jahren 0
@DragonLord Dieser Artikel kann nützlich sein http://www.howtogeek.com/149225/why-do-computers-count-from-zero/ Simon vor 11 Jahren 0
@ Simon: Wow, ich bin berühmt ': P' bwDraco vor 11 Jahren 0
@DragonLord Offensichtlich eine Frage, über die es sich zu schreiben lohnt :) Simon vor 11 Jahren 0

17 Antworten auf die Frage

87
Matteo

Das Zählen von Arrays von 0 vereinfacht die Berechnung der Speicheradresse jedes Elements.

Wenn ein Array an einer bestimmten Stelle im Speicher gespeichert wird (Adresse genannt), kann die Position jedes Elements als berechnet werden

element(n) = address + n * size_of_the_element 

Wenn Sie das erste Element als erstes betrachten, wird die Berechnung

element(n) = address + (n-1) * size_of_the_element 

Nicht viel anders, fügt jedoch für jeden Zugriff eine unnötige Subtraktion hinzu.

Bearbeiten

  • Die Verwendung des Array-Index als Offset ist keine Anforderung, sondern eine Gewohnheit. Der Versatz des ersten Elements könnte vom System ausgeblendet werden und bei der Zuordnung und Referenzierung des Elements berücksichtigt werden.

  • Dijkstra veröffentlichte einen Artikel "Warum Nummerierung bei Null beginnen sollte" ( pdf ), in dem er erklärt, warum der Start mit 0 die bessere Wahl ist. Start bei Null ermöglicht eine bessere Darstellung der Bereiche.

+1 für die richtige Antwort. Beachten Sie, dass die 0-basierte Indizierung nur eine * (sehr häufige) * Konvention der verwendeten Sprache ist. es ist nicht universell. Beispielsweise verwendet [Lua die 1-basierte Indexierung] (http://stackoverflow.com/questions/2785704/why-do-lua-arraystables-start-at-1-instead-of-0). Die "unnötige Subtraktion" mag in früheren Zeiten der Grund für die 0-basierte Indexierung gewesen sein, aber jetzt wird sie von den meisten Sprachen verwendet, einfach weil es das ist, was jeder bereits gewohnt ist * (hauptsächlich dank C) *, und es gibt keinen zwingenden Grund dafür Ändern Sie diese Konvention. BlueRaja - Danny Pflughoeft vor 11 Jahren 8
Das ist die richtige Antwort. Yuck vor 11 Jahren 0
Das macht keinen Sinn. Die Position jedes Elements kann immer als `address + n * size_of_element 'berechnet werden, solange die" Adresse "die Adresse des nullten Elements ist. Dies funktioniert perfekt, unabhängig davon, ob das nullte Element als Element des Arrays vorhanden ist oder nicht. Die Frage ist, warum das nullte Element existiert und nicht, warum wir Adressen als Adresse des (möglicherweise fiktiven) nullten Elements speichern. (Was das antwortet.) David Schwartz vor 11 Jahren 2
@DavidSchwartz Natürlich ist das nullte Element in diesem Fall jedoch nicht adressierbar. Wenn Ihr Array bei 1 beginnt, werden Sie niemals das nullte Element verwenden. Matteo vor 11 Jahren 0
@DavidSchwartz Die Antwort ist nicht ** falsch **. Als die ersten Sprachen entwickelt wurden, war der Speicher noch schlimmer als eine zusätzliche Berechnung bei jedem Zugriff. Ich behaupte nicht, dass dies die einzige Möglichkeit ist, eine Adresse zu berechnen, aber ich behaupte, dass dies der Grund war, warum die Adressierung bei 0 beginnt. Matteo vor 11 Jahren 0
@ Matteo: Was hat das Wegwerfen von Speicher mit etwas zu tun? Das Speichern der Adresse eines Arrays als Adresse eines nullten Elements würde keinen Speicher wegwerfen, wenn das nullte Element nicht vorhanden wäre. Sie müssen dafür keinen Platz reservieren. Die Antwort ist falsch. David Schwartz vor 11 Jahren 1
@DavidSchwartz Nehmen wir eine * alte * Sprache als C. Wenn Sie Speicher zuweisen, erhalten Sie eine Adresse, an der der Speicher beginnt. Wenn ein Compiler so etwas wie "v [n]" sieht, muss er die Adresse des Ausdrucks berechnen. Wenn die Indizes eine 0 beginnen, ist die Berechnung die Größe v + x *. Bei 1 ist die Berechnung v + (x-1) * size. Beispielsweise entspricht v [1] v + (1-1) * Größe, die v ist. Matteo vor 11 Jahren 3
lassen Sie uns [diese Diskussion im Chat fortsetzen] (http://chat.stackexchange.com/rooms/8208/discussion-between-david-schwartz-and-matteo) David Schwartz vor 11 Jahren 0
@David: In C * (der Sprache, die die 0-basierte Indexierung wirklich populär machte) * sind Arrays und Zeiger weitgehend austauschbar. Daher ist es aus verschiedenen Gründen wichtig, dass "* array" tatsächlich auf das erste Element verweist. Ein Beispiel: Wenn wir 'array' auf den Speicherplatz * vor dem ersten Element * zeigen, wäre das Casting auf ein Array eines anderen Typs problematisch, z. die Position des zweiten Bytes in einem Array von `int`s würde von der Wortgröße abhängen; auf einer 32-Bit-Maschine würde es sich um `((char *) intArray + 5)` handeln !! BlueRaja - Danny Pflughoeft vor 11 Jahren 4
Die Antwort lautet: Wenn das erste Element eines Arrays Null ist, bedeutet dies, dass die Adresse des Arrays die Adresse des ersten Elements sein kann und Sie die Adressen der Elemente im Array immer noch als "base + index * size" berechnen können . Dies bedeutet, dass Sie gewöhnliche Objektzeiger und Ein-Element-Arrays gleich behandeln können. Dies erlaubt es C-Arrays und Zeigern, so reibungslos und einfach zusammenzuarbeiten. David Schwartz vor 11 Jahren 0
No, this is not an issue of whether the array has a zeroth element. Because, you see, there is also scaling. If I have an array of 8 byte objects, and I overlay that with a byte array, what is the byte index of object [42]? Why it is simple: 42 * 8. The problem with 1 based is that this offset of 1 is 1 byte when I look at the byte array, and it is 8 bytes when I look at the overlaid 8-byte-unit array. Kaz vor 11 Jahren 3
37
Dougvj

Während die folgenden Prinzipien für Dezimalzahlen sowie für jede andere Basis gelten, kann das Zählen von 0 in Computern auf einfache Weise aus dem binären System mit fester Ziffer für die Darstellung von in Computern verwendeten Zahlen verstanden werden. Wenn Sie 8 Bits haben, gibt es 256 mögliche Kombinationen von 1 und 0, die ausgedrückt werden können. Sie können diese 8-Bit verwenden, um die Zahlen 1-256 auszudrücken, aber dies würde 0 weglassen, was in der Mathematik als Zahl an sich nützlich ist, also werden sie verwendet, um die Zahlen 0-255 auszudrücken.

Dies setzt bereits einen Präzedenzfall einer natürlichen Reihenfolge von 0 (alle 0 in der binären Darstellung) bis 255 (alle 1 in einer 8-Bit-Zahl). In Anbetracht des Systems zum Darstellen von Zahlen ist es sinnvoll, von 0 aus zu beginnen, da 0 die "erste" Zahl im System ist, also 1 die "zweite" Zahl ist und so weiter.

Ein weiterer Grund, warum das Starten von 0 in Computern so bequem ist, liegt in dem Konzept der Offsets. Ein Offset ist eine Zahl, die die Entfernung von einem Speicherort oder einer Festplatte oder einem anderen "adressierbaren" Medium darstellt. In Computern werden praktisch alle Daten linear gespeichert, was bedeutet, dass es eine Reihenfolge für die Daten gibt, ein erstes Byte, ein zweites Byte usw. Es ist günstig, die Position von "Datenbereichen" über einen Offset auszudrücken. Was ist das erste Byte in einem Datenblock? Es ist am Offset '0', dh es wird 0 Byte nach dem ersten Byte im Datenblock gefunden. Während es möglich ist, das erste Byte mit "1" zu kennzeichnen, verursacht dies aus verschiedenen Gründen Komplikationen bei der Darstellung der Daten:

  • Durch den Ausschluss von 0 zum Adressieren von Daten reduzieren Sie die Anzahl der Dinge, die Sie mit einer 8-Bit-Nummer ansprechen können, um eins.
  • Um den Versatz zu berechnen, der auf der Hardwareebene des Datenzugriffs erforderlich ist, müssen Sie irgendwann einen von der Nummerierung abziehen, was eine Komplexität mit sich bringt.
  • Zeiger auf einen Datenblock zeigen immer auf den ersten Block. Daher ist die Arithmetik beim Start von 0 unkompliziert. Das heißt, das erste Byte im ersten Block des ersten Datenclusters ist 0 + 0 + 0, wenn Sie mit 0 beginnen, es ist 1 + 1 + 1 - 1 -1, wenn Sie von 1 aus beginnen.) Die Arithmetik, wenn Sie von 1 aus mit verschachtelten Datenstrukturen wie diesem Beispiel beginnen, kann verwirrend sein.
Ich kann von 0 aus sehen, wenn nichts vorhanden ist. Ich wünschte, jemand könnte erklären, warum die 1. Platte 0 ist, wenn sie jetzt 1 Festplatte ist. Drehen Sie sich um und benennen Sie die erste Partition 1, wenn sie bei Null beginnt (0). Ich konnte sehen, warum die erste ausgegebene IP-Adresse 0 wäre, da dies den Server / Master identifizieren könnte und der Rest nummeriert sein könnte. Warum fängt es bei 1 an? In einem Hex-Editor ist der 1. Chunk 0, aber es ist fast immer 1 etwas dabei, aber in einem Texteditor ist der Zeichenzähler 0, wenn keine vorhanden ist. Ich denke, dass Menschen involviert sind, besonders wenn sie versuchen, durch 0 * + Absturz + * zu teilen. Psycogeek vor 11 Jahren 0
Hat nichts mit binärer Darstellung zu tun. Sowohl die Binär- als auch die Dezimalzahl beginnen mit 0. Matteo vor 11 Jahren 30
Wenn Sie mit dem Zählen von 0 beginnen, reduzieren Sie nicht die Anzahl der Adressen, die Sie (theoretisch) von 1 auf 257 setzen könnten. Matteo vor 11 Jahren 2
gute Antwort . Nach einigen Recherchen fand ich die Zitate, die den zweiten Teil der Antwort mehr stützen. In Laiensprache hatten alte Sprachen das Konzept der Null, da @Dougvj sagte, dass die Daten in lenären Arrays von Arrays gespeichert wurden. Der Versatz kommt ins Bild. Um dies mit der Array-Nummerierung abzustimmen, begannen sie mit der Indexierung mit 0. Hoffentlich hilft das adithya vor 11 Jahren 0
@ Matteo nicht in einem einzigen Byte, das Sie nicht konnten OrangeDog vor 11 Jahren 6
@OrangeDog Natürlich könnte ich: mit einem einzelnen Byte bekomme ich 256 Werte, wie ich sie interpretiere ** (**) (0-255, 1-256, 300-555) spielt keine Rolle. Matteo vor 11 Jahren 0
@ Matteo aber Sie sagten 1-257, das sind 257 Werte. OrangeDog vor 11 Jahren 1
@OrangeDog Ooops Entschuldigung ... Matteo vor 11 Jahren 1
"255 (alle 1 in einer 8-Bit-Zahl)" Sie denken in Zweiergruppen. In [komplementär] (http://en.wikipedia.org/wiki/One%27s_complement) (das vor allem in den Zeitrahmen, in denen diese Frage auftaucht, einigermaßen verbreitet war), wurde die All-One-Binärzahl `-0 dargestellt `, nicht` 2 ^ n - 1` für `n` Bits. a CVn vor 11 Jahren 1
@Matteo, Sie haben die richtige Dezimalzahl und die Binärzeichen beginnen bei 0. Meine Betonung liegt mehr auf der Grenze der Binärdarstellung im physischen Computer, wobei 0 die erste Zahl in der endlichen Menge ist, und das ist viel wichtiger als in der mathematischen Dezimalzahl, wo es ist keine endliche Anzahl von Zahlen. Natürlich führt das Zweierkompliment negative Zahlen ein, die in der Mathematik nützlich sind, aber auch als Offsets, bei denen das erste Byte vor einem Block mit -1 angegeben wird. Das erste Byte im Block ist notwendigerweise noch 0. Dougvj vor 11 Jahren 0
@Dougvj Nullbasiertes Zählen hat absolut nichts mit Binärem zu tun. Bei dem Punkt, den Sie ansprechen, geht es darum, jede Zahl in einer Darstellung mit fester Ziffer zu verwenden. Dies ist unabhängig davon, ob Sie Basis 2, Basis 10 oder Basis 23517 verwenden. Peter Olson vor 11 Jahren 8
-1 Es hat absolut nichts mit binärer Darstellung zu tun. BlueRaja - Danny Pflughoeft vor 11 Jahren 2
Peter Olsen. Du hast recht. Ich wollte nicht andeuten, dass dies eine ausschließliche Folge der Verwendung von Basis 2 war. Ich werde das klarstellen. Dougvj vor 11 Jahren 0
@BlueRaja Ich glaube, ich habe diesen Aspekt besser geklärt. Dougvj vor 11 Jahren 0
Ich denke, Sie sollten auch Modulo-Operationen erwähnen. Matlab hat 1 basierte Indizierung und wenn Sie jemals versucht haben, etwas in einer Schleife zu modulieren, wünschen Sie sich wahrscheinlich, dass es auf Null basiert. :) Corporal Touchy vor 11 Jahren 0
Die Betonung dieser Antwort auf binär ist völlig irreführend. Dies wird nicht dadurch gemildert, dass die „Prinzipien… auch für die Dezimalzahl gelten“ - es ist einfach ein roter Hering, um überhaupt binär zu erwähnen, und das Verständnis wird durcheinander gebracht. Es gibt ** keine ** Verbindung. Konrad Rudolph vor 11 Jahren 1
@Konrad Rudolph Sie haben vielleicht Recht, aber das OP verlangte eine Erklärung aus einer nicht programmierenden Perspektive. Das Verstehen von Binärdaten hilft zu verstehen, warum Computer auf Architekturebene bei 0 beginnen. Ich weiß nicht, wie ich dies klarer machen kann, ohne sich auf Binärdateien zu beziehen. Dougvj vor 11 Jahren 0
@Dougvj Sehen Sie sich die anderen Antworten mit den meisten Stimmen an. Konrad Rudolph vor 11 Jahren 0
26
Ярослав Рахматуллин

Ich hätte nie gedacht, dass eine Gelegenheit für einen Sesselphilosoph wie ich bei Superuser mitkommen würde. Es gibt hier ein grundlegendes Missverständnis, denn Nicht-Philosophen neigen dazu, die winzigen Details zu überspringen. Kurz gesagt: Computer zählen nicht von Null, sondern der Wert von Positionen beginnt bei Null.

Es ist nichts Verwirrendes an dieser wahrgenommenen Inkonsistenz zwischen Computer- und menschlichen (beliebigen) Zählverfahren. Lassen Sie uns die Frage zerlegen.

Warum zählen Computer von Null?

  • Sie zählen nicht von Null an

Computer zählen Werte ab Null. Zum Beispiel Arrays in C.

  • Der Index (Positionsanzeige, Zählerstand) beginnt bei Null. Die Anzahl der Elemente in einem Array, bei denen ein einzelnes Element am Index 0 vorhanden ist, ist Eins

Null ist praktisch, um eine Leere oder den Mittelpunkt einer Skala darzustellen. Es ist nicht praktisch , irgendetwas zu zählen, weil es durch Definition von Null unmöglich ist.

In der gleichen Weise wie der Mittelpunkt einer Skala kann die Null verwendet werden, um die Kante (absoluter Anfang) einer Sammlung darzustellen. Die Frage ist bedeutungslos, weil sie inkonsistent zwischen "Zählwerten" und "Zählen von Null" ist.

Ja, Computer zählen von Null, aber von Eins. Die beiden Wörter haben unterschiedliche Bedeutung.

tally [tal-ee]

Substantiv

  1. ein Konto oder eine Abrechnung; eine Aufzeichnung der Abbuchung und Gutschrift, der Punktzahl eines Spiels oder dergleichen.
  2. alles, auf dem eine Punktzahl oder ein Konto geführt wird ..
  3. eine Anzahl oder eine Gruppe von Elementen aufgezeichnet.

zählen [kount]

Verb (wird mit Objekt verwendet)

  1. (die einzelnen Einheiten oder Gruppen einer Sammlung) nacheinander zu überprüfen, um die Gesamtzahl zu bestimmen; addieren; Aufzählen: Er zählte seine Tickets und stellte fest, dass er zehn hatte.
  2. zu rechnen Berechnung; berechnen.
  3. Um die Zahlen aufzulisten oder zu benennen: Schließen Sie die Augen und zählen Sie zehn.

(dictionary.com)


Die praktischen Gründe werden von Dougvj ausreichend beschrieben, ich habe dort nichts hinzuzufügen. Wenn wir nur einen CS-Professor (aus den 60ern) haben könnten, um einen historischen Bericht zu geben ...

Woher wissen Sie eigentlich, wo der Computer etwas startet? Alles, was Sie wissen, ist, dass Sie, wenn Sie es verwenden, SAGEN, es bei Null zu beginnen. Daniel R Hicks vor 11 Jahren 0
Ich spreche hier Definitionen von Begriffen und Logik, nicht wie Computer an sich funktionieren. Ich weiß ein bisschen, wo Computer anfangen, weil ich CS-Kurse besucht habe. Ярослав Рахматуллин vor 11 Jahren 0
Um vollkommen pedantisch zu sein, vergleichen Sie ein Verb mit einem Substantiv. Ich denke, "Zählung" und "Zählung" sind wirklich synonym, und beide können entweder als Verb oder als Substantiv verwendet werden. Brian vor 11 Jahren 1
@Brian Eine faire Beobachtung und und meine Absicht ist es, auf pedantische Weise zu veranschaulichen, dass die Verwirrung auf einer Fehlinterpretation von Begriffen beruht. Es gibt nicht wirklich einen Unterschied zwischen "dem 1. Element" und "dem Element an Position 0". Sie sind beide Element eins. Das * erste *, nicht "* nullte *". Es gibt kein * Zählen von Null *. Die Aufzählung beginnt bei * eins * per definitionem, während die Adressierung a-> 1, b-> 2 sein kann. c-> 3 oder 0-> 1, 1-> 2, 2-> 3. Das bekannteste Beispiel für "Zählen von Null" ist in Mathematikbüchern der Mittelstufe in Form von zu finden - der Index ist jedoch ein * Index *. Ярослав Рахматуллин vor 11 Jahren 1
@ ЯрославРахматуллин - Ich habe auch ein paar CS-Kurse besucht. Und entwarf Computer und LSI-Schaltungen sowie schriftliche Compiler und Java-JITCs. Daniel R Hicks vor 11 Jahren 0
@DanielRHicks Ich kann mich nicht auf umfangreiche (oder auch keine) praktische Erfahrung berufen, aber aufgrund meiner Intuition und meines knappen theoretischen Wissens auf diesem Gebiet halte ich Folgendes für: * Gemeinsames Design besteht darin, von Null zu indexieren. Das Zählen eines Elements am Index Null sollte 1 ergeben, wenn es gemäß der Definition der Begriffe entworfen wurde. * Der Versuch, meine Antwort aufgrund meiner Erfahrung oder meines Wissens zu diskreditieren, ist zwecklos, weil sie sich auf nichts davon stützt. Danke für die Kommentare, alle. Es hat Spaß gemacht, diese Frage zu beantworten und auf die Kommentare einzugehen, aber ich denke nicht, dass weitere Wiederholungen irgendetwas klären werden. Ярослав Рахматуллин vor 11 Jahren 0
It's just that designers actually wandered around quite a bit before they settled on the current scheme. What seems "obvious" now wasn't. And likely a somewhat different scheme could have been chosen and would now seem more "obvious" than what we have. Daniel R Hicks vor 11 Jahren 1
[Zwei-Quinary] (http://en.wikipedia.org/wiki/Bi-quinary_coded_decimal), zum Beispiel. Daniel R Hicks vor 11 Jahren 0
12
NevilleDNZ

Ich denke, das wurde schon früher von " prof.dr. Edsger W. Dijkstra " - Burroughs Research Fellow in einem Schreiben vom 11. August 1982 behandelt: vgl. EWD831

Titel: Warum Nummerierung bei Null beginnen soll . "Gibt es Gründe, eine Konvention der anderen vorzuziehen? Ja, es gibt ..."

Beachten Sie auch, dass Dijkstra Ende 1968 im ALGOL 68- Designteam war. Algol68 erlaubt Arrays von 0, 1 oder einer beliebigen Zahl, die der Programmierer für den Algorithmus als angemessen erachtet. cf ( "The Making of Algol 68" erzählt: "Können Sie dreieckige Arrays definieren?", wurde jemand (Tony Hoare?) unterbrochen. "Nicht nur dreieckig, sondern sogar elliptisch", antwortete Aad und zeigte, wie. ')

Wenn in Algol68 Arrays (& Matrizen) in Scheiben geschnitten werden, erhalten sie einen Index @ 1, sodass eine Neigung zu [1: ...] Arrays besteht. Aber die "1 st " untere Grenze kann verschoben werden am Start "0 th " Position, die durch die Angabe "@ 0", zB Vektor x [4: 99 @ 2], y - Matrix [4: 99 @ 1,4: 99 @ 0]. Ebenso gibt es eine Voreinstellung von 1 in do- Schleifen (sofern nicht ausdrücklich " von 0" angegeben wird) und von 1 für den ganzzahligen Fall i in ~, ~, ~ esac und $ c (~, ~, ~) ) $ Wahl Klauseln.

Es scheint, dass die Äußerungen von Dijkstra über den Berichtsentwurf vom März 1968 ( MR93 ) und seine Insistenzen zu einem Flammenkrieg vor dem Usenet geführt haben : "Es gibt Schriften, die zwar liebenswürdig, aber unrammatisch sind, und andere Schriften, die äußerst grammatikalisch sind, aber sind ekelhaft. Das kann ich oberflächlichen Personen nicht erklären. " EWD230

Der Algol 68-Abschlussbericht (FR) wurde am 20. Dezember 1968 veröffentlicht, als er auf der Münchner Tagung abgelehnt und von der Arbeitsgruppe angenommen wurde. Anschließend der von der Generalversammlung der IFIP der UNESCO zur Veröffentlichung gebilligte Bericht .

Um den 23. Dezember (?) 1968 unterzeichneten Dijkstra, Duncan, Garwick, Hoare, Randell, Seegmüller, Turski, Woodger und Garwick den AB31.1.1.1 "Minority Report", Seite 7 (Erschienen 1970).

10
Random832

The distance analogy someone else brought up lends itself to a very practical illustration:

"How far is your house from the nearest gas station?"

"1 mile."

"You live at the gas station?"

"No, if I lived at the gas station it would be 0 miles"

"Why are you counting from zero instead of from one?"

Another good example would be birthdays - we don't say someone's is one year old the day they are born, we say it's a year later.

We say leap years or US presidential elections are every four years, even though if you count from one: 2000, 2001, 2002, 2003, 2004 is five years. (Incidentally, the Romans did screw this up for a while, and had leap years too close together)

My point is, we "count" from zero all the time in the real world - "How many positions after [start of array] is the element you want" simply happens to be the question you are answering with a count-from-zero in many computer programs. You wouldn't say that the first element is one position after the start, would you? It is the start.

Ihre Rechnung bezüglich der Wahlen ist um ein Jahr falsch. Ihr Beispiel enthält 2 Wahljahre innerhalb eines Zeitraums von 5 Jahren; das richtige Beispiel wäre, dass von einer Wahl zur nächsten vier Jahre vergehen, dh 2000 -> 2001 (eine einjährige Spanne), 2001 -> 2002, 2002 -> 2003, 2003 -> 2004. Jimmy vor 11 Jahren 1
@Jimmy Das war mein _point_ - wenn Leute "von einem" in dem Sinn gezählt werden, in dem sie Computer haben wollen, würden sie 2000 als eins statt als Null zählen. Dies ist übrigens so, wie die alten Römer es tatsächlich getan haben (und tatsächlich einen Zyklus wie "2000, 2004, 2008" als Fünfjahreszyklus bezeichnen würden). Random832 vor 11 Jahren 1
Ihr Geburtstagsbeispiel ist nicht allgemein zutreffend. Zum Beispiel wird [in Südkorea das erste Lebensjahr als eins statt Null gezählt] (http://en.wikipedia.org/wiki/East_Asian_age_reckoning). BennyMcBenBen vor 11 Jahren 2
6
Jack Aidley

Wie von anderen schon gesagt, zählen Computer nicht von Null .

Einige Sprachindizes ab 0. Die Indexierung ab 0 hat zwei Hauptvorteile:

  1. Es wird auf natürliche Weise in eine Assembly konvertiert, da es als Versatz von einem Zeiger zur ersten Position interpretiert werden kann.

  2. Du bekommst keine Komik, wenn du Negative willst. Wie viele Jahre zwischen 1BC und 1AD? Keiner. Denn obwohl BC effektiv negative Daten ist, gibt es kein Jahr Null. Wenn es 0AD gegeben hätte, gäbe es hier kein Problem. Sie sehen überall in der Wissenschaft dasselbe Problem, bei dem die Menschen das erste Element in einer Gruppe naiv als +1 definiert haben.

Yes, and the whole stupidity of waiting until 2001 for the new milennium. This confused exactly those people who also don't "get" zero based arrays when they dabble in programming. :) Kaz vor 11 Jahren 0
Auch wenn "1 Meile" "hier" bedeutet, bedeutet eine Meile 1760 Fuß. "1760 Fuß" bedeutet also auch "genau hier", oder? Falsch bedeutet "1 Fuß" genau hier, oops! In dieser Dummheit, die auf dieser Basis basiert, ist "hier" ein Fuß, ein Zoll, ein Zentimeter usw. Kaz vor 11 Jahren 3
@ Kaz wo Füße => Yards. 1760 Meter in einer Meile. Brad vor 10 Jahren 0
3
Kaz

Counting naturally begins at zero

Here is the algorithm for counting apples in a basket:

count := 0 for each apple in basket count := count + 1 

After the execution of the above, count holds the number of apples. It may be zero, because baskets can be empty.

If you don't use your credit card for an entire month, do you get a bill of 1 dollar? Or 1 cent?

When you reset the trip meter on your car's odometer, does it go to 0001 or 0000?

Arrays can provide multiple views of the same data

Consider an array of 32 bit structures d, which are each made of 16 bit words w. Each word is made up of two 8 bit bytes b. Under zero indexing, the overlay looks very convenient:

d: | 0 | 1 | w: | 0 | 1 | 2 | 3 | b: |0|1|2|3|4|5|6|7| 

The 32 bit object d[1] as at the word address w[2] which is easily computed by multiplying the index by 2, which is the ratio of the sizes of the 32 and 16 bit object. Furthermore, in byte addressing, it is b[4].

This works because zero is zero, in every unit of measurement: byte, word, double word and so on.

Look at the above diagram: it looks much like a ruler, where unit conversions are intuitive.

With one based indexing, it breaks:

d: | 1 | 2 | w: | 1 | 2 | 3 | 4 | b: |1|2|3|4|5|6|7|8| 

Now we cannot simply multiply the d index by 2 to get the w index, or by 4 to get the b index. The conversion between units becomes clumsy. For instance to go from d[2] to b[4], we have to calculate ((2 - 1) * 4) + 1 = 5.

We have to subtract out that pesky 1 bias in the d units, then do the scaling in the natural zero-based coordinate system, and then add back the pesky 1 in b units. Note that it's not the same 1! We subtract one double word width, but then add in one byte width.

Converting between different views of the data becomes something like Celsius-Fahrenheit conversion.

Those who say that one-based arrays are easy to deal with at the implementation level, because there is just a simple subtraction of 1 are fooling themselves, and you. This is true only if we do not do any scaling calculations among different data types. Such calculations happen in any program that has a flexible view on data (e.g. a multi-dimensional array also accessed as a one-dimensional one) or that manipulates storage: for example, a memory allocator, file system, or video frame buffer library.

Minimizing Digits

In any base, if we want to use the fewest digits to implement a range of values which is a power of the base, we must start from zero. For instance, in base ten, three digits is enough to give us a thousand distinct values from 0 to 999. If we start from 1, we overflow by just one value, and we need four digits.

This is important in computers, because the number of digits in binary translates to hardware address lines. For instance a ROM chip with 256 words in it can be addressed from 0 to 255, which requires 8 bits: 00000000 to 11111111. If it is addressed from 1 to 256, then nine bits are needed. We have to wastefully add one more address trace to the circuit board or integrated circuit. So what would possibly happen in practice would be that 0 would just be called 1 at the software API level for accessing that chip. A request for word 1 would actually put 00000000 on the 8 bit address bus. Or else, a request for 1 would translate to address 00000001, as expected, but a request for 256 would map to the otherwise unused 8 bit address 00000000 rather than the 9 bit address 100000000. Both of these bag-biting kludges are really solutions in search of a problem, and are avoided entirely by consistently using 0 to 255 at the hardware, in the software and in all user interfaces and documentation.

One-based displacements are fundamentally stupid

Consider Western music theory for instance. We have diatonic scales with seven notes, but we call the space which they cover an octave! Inversion of intervals then follows the rule of nine: for instance the inversion of a third is a sixth (subtract three from nine). So three different numbers are at play for something so simple: seven (notes in a scale), eight (octave) and nine (subtract from to invert).

If seven notes made a septave or heptave, and intervals were zero based, then we would subtract from seven to invert. Everything based on seven.

Furthermore, intervals could be easily stacked. In the current system, if we leap by a fifth and then by a fourth again, and then by a third, we cannot just add these. The resulting interval is two less. It is not a twelvth, but actually a tenth! At each stage, we have to subtract a one. Going up by a fifth and then a fourth isn't a ninth, but only an octave.

In a sanely designed music system, we could just add intervals to determine the resulting leaps. A sequence of notes which begins and ends on the same note would then have a property similar to the voltage law around a circuit: all the intervals would add to zero.

Music theory and writing is badly outdated. Most of it has not changed since the days composing was done with quill pens by the light of a candle.

One-based systems confuse the same people who can't handle zero-based arrays

When the year 2000 rolled around, many people were confused why the new millennium hasn't begun. Those pointing out that it won't begin until 2001 were regarded as party poopers and dweebs. After all, you're in your 20's when you turn 20, right? Not when you turn 21. If you thought that the millennium started on January 1, 2000, then you have no right to complain about zero based arrays in any programming language. They work how exactly how you like. (But, yes, proponents of one-based displacements and arrays are dweebs and party-poopers. Centuries should start on the XX00 years, and millennia on X000 years.)

Calendars are dumb, but at least time of day is zero based

Each new minute on your watch starts with :00 seconds. Each new hour starts with 00:00 minutes and seconds. And, at least on a 24 hour clock, the day rolls around when midnight strikes and 11:59:59 increments to 00:00:00.

Thus if you want to calculate seconds from midnight for a time like 13:53:04, you just have to evaluate 13 * 3600 + 53 * 60 + 4. No insipid 1 additions or subtractions.

Closing rant about MIDI

Okay, what is it with musicians, even supposedly technical ones?

MIDI! It uses zero-based numbering for programs and channels in the actual wire representation of messages, but gear displays it as 1 based! For instance programs 0 to 127 are called 1 to 128 on most gear, but some calls them 0 to 127 or even gives the user a choice.

Programs 71 through 80 are a considered a "bank" of ten. It says so right on my MIDI pedal, for example. The footswitches are labeled from 1 to 10 and if I'm in the seventh bank, they pick programs 71 through 80. However, some devices or computer software displays the 1-128 program numbers as 0 to 127, or even gives the user a choice! What is worse: one-based systems, or chaos created by using both one and zero based at the same time?

MIDI channel numbers are called 1 to 16, but are represented by 0 to 15 binary. As if out of spite for the one-based presentation, some gear uses a dispswitch for configuring a channel number and, often, thes switches just use the zero based binary code. So if you want channel 3, you must toggle it to 0010 (binary 2).

1
unknownprotocol

If I recall correctly from my Programming Language Concepts class... languages being 0-indexed and others being 1-index had to do with historical reasons. Algol-68, the grand-daddy of programming languages was actually 1-indexed, as well as Fortran and a few other "business" languages like COBOL. In some of these languages however, you could actually specify explicitly what your starting index would be. There's a interesting table of this here.

Basically back in the "Ye Olde Days" mathematicians, scientists, and other "academics" usually used 0-indexed languages, while users of languages like COBOL found it of no use to start counting at 0, so in those languages it made more sense to start at 1 (it seemed less confusing).

Now if your question refers to why as far as why a computer (not a language) naturally starts to count from zero... well it's I guess inherent in the binary really: ex: 0000 = zero 0001 = one ... so on and so forth...

Hat nichts mit binärer Darstellung zu tun. Sowohl Binär- als auch Dezimalzahlen beginnen mit 0 (wie Sie in Ihrem Beispiel zeigen). Matteo vor 11 Jahren 4
Nun, es hat etwas anderes mit Binärem zu tun. Mit vier Bits (0000 bis 1111) können Sie eine Speicherbank von 16 Wörtern ansprechen. Wenn Sie es einseitig machen, benötigen Sie fünf Adresszeilen, um 0001 bis 10000 darzustellen. Andernfalls machen Sie, was MIDI beispielsweise mit Kanalnummern tut: 0000 wird intern verwendet, aber die Benutzeroberflächen zeigen 1! Bei Hardware, die auf Dezimalzahlen basiert, ist dies jedoch dasselbe Problem. Drei Ziffern geben Ihnen tausend Adressen, wenn Sie mit Null beginnen, aber wenn Sie mit 1 beginnen, benötigen Sie vier Ziffern. Kaz vor 11 Jahren 0
1
9dan

Nummer 0 kann verschiedene Bedeutungen bezeichnen: numerischer Wert, Ordinalzahl, Speicheradresse usw.

'Index Null' bedeutet nicht, dass Programmierer von Null aus gezählt werden. Es bezeichnet die erste Stelle eines zugewiesenen Speicherblocks und '0' ist die Adresse davon.

In C kann das Durchlaufen eines Arrays wie folgt geschrieben werden:

int arr[N]; for (i=0; arr[N]; ++i) { ... } 

Dieselbe Arbeit kann in C # ausgeführt werden:

Object[] arr;  for (Object o in arr) { ... } 

Ich denke, in beiden Beispielen wird nicht gezählt.

1
TV's Frank

Starting at zero is practical when describing a distance from something. So in this array:

[4,9,25,49]

the distance from the start of the array to the 25 is 2 - you need to skip two steps to get there. The distance to the 4 is zero - you don't need to move from the start at all.

It's practical to think like this when adding up distances (or indexes) - I advance one step, then zero steps, then two steps, where am I? I am at index 1 + 0 + 2 = 3. Skipping three steps, I end up at 49 in the array above.

Das Zählen der Etagen in einem Gebäude sollte eigentlich auf dieselbe Weise erfolgen (auch wenn wir es in den USA nicht so machen). Die Bodenhöhe sollte Null sein, weil Sie nicht nach oben oder unten gegangen sind. Es ist eine Ausgangsposition. vor 11 Jahren 0
Dennoch ist das Erdgeschoss das erste, zu dem Sie kommen. Sie beginnen zu zählen, wenn Sie das Gebäude betreten, im Erdgeschoss, und addieren, wenn Sie nach oben gehen. Bei Null zu beginnen ist sinnvoll, wenn Sie "in einem Gebäude" als Standardzustand / Normalzustand / Naturzustand betrachten, was einen interessanten Kommentar zur städtischen Gesellschaft darstellt. Null für Boden ist auch sinnvoll, wenn mehrere Unterebenen gemeinsam sind. vor 11 Jahren 0