Por que os computadores contam de zero?


55

Os computadores tradicionalmente registram valores numéricos a partir de zero. Por exemplo, matrizes em linguagens de programação baseadas em C começam no índice zero.

Que razões históricas existem para isso e que vantagens práticas a contagem de zero tem sobre a contagem de um?

Nota: Esta pergunta pede respostas técnicas bem explicadas, não apenas opiniões, e destina-se a cobrir os computadores em geral, em vez de apenas a programação. Essa pergunta se expande sobre a questão dos programadores "Por que as estruturas / matrizes são baseadas em zero?" .



9
Houve mais do que alguns exemplos de linguagens de computador que usavam matrizes de 1 origem.
Daniel R Hicks

23
Por que os humanos não contam de 0?
Untitled

47
Woah, woah, ninguém conta a partir de zero, indexamos a partir de zero. Ninguém diz o elemento "zeroth". Dizemos o "primeiro" elemento no índice 0. Pense no índice como a que distância um elemento é deslocado da primeira posição. Bem, o primeiro elemento é na primeira posição, então não é compensado em tudo, então o índice é 0. O segundo elemento como um elemento antes dele, por isso é compensado 1 elemento e está no índice 1
mowwwalker

14
@ Ramhound Não, não é. A indexação baseada em zero não tem nenhuma relação com o uso de binário.
Peter Olson

Respostas:


88

Contar matrizes de 0 simplifica o cálculo do endereço de memória de cada elemento.

Se um array é armazenado em uma determinada posição na memória (é chamado endereço), a posição de cada elemento pode ser calculada como

element(n) = address + n * size_of_the_element

Se você considerar o primeiro elemento o primeiro, a computação se tornará

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

Não é muito diferente, mas adiciona uma subtração desnecessária para cada acesso.

Editar

  • O uso do índice da matriz como um deslocamento não é um requisito, mas apenas um hábito. O deslocamento do primeiro elemento pode ser oculto pelo sistema e levado em consideração ao alocar e referenciar o elemento.

  • Dijkstra publicou um artigo "Por que a numeração deve começar em zero" ( pdf ), onde explica por que começar com 0 é uma escolha melhor. Começar do zero permite uma melhor representação dos intervalos.


8
+1 para a resposta correta. Observe que a indexação baseada em 0 é apenas uma convenção (muito comum) do idioma que está sendo usado; não é universal. Por exemplo, Lua usa indexação baseada em 1 . A "subtração desnecessária" pode ter sido o motivo por trás da indexação baseada em 0 nos velhos tempos, mas agora a maioria das línguas a utiliza simplesmente porque é a que todos já estão acostumados (em grande parte graças a C) , e não há motivo convincente para mudar isso. convenção.
BlueRaja # Danny Pflughoeft

2
Isso não faz sentido. A posição de cada elemento sempre pode ser calculada address + n * size_of_elementdesde que o "endereço" seja o endereço do elemento zeroth. Isso funciona perfeitamente se o elemento zeroth existe como um elemento da matriz ou não. A questão é por que o elemento zeroth existe, não por que armazenamos endereços como o endereço do (possivelmente nocional) elemento zeroth. (Que este respostas.)
David Schwartz

3
@DavidSchwartz Vamos usar um idioma antigo como C. Se alocar memória, você obtém um endereço onde a memória é iniciada. Se um compilador vê algo parecido, v[n]ele precisa calcular o endereço da expressão. Se os índices iniciarem um 0, o cálculo será do tamanho v + x *. Se em 1 o cálculo for v + (x-1) * tamanho. Por exemplo, v [1] corresponderá a v + (1-1) * tamanho que é v.
Matteo

4
@ David: Em C (a linguagem que realmente popularizou a indexação baseada em 0) , matrizes e ponteiros são amplamente intercambiáveis, por isso é importante por várias razões que *arrayrealmente se referem ao primeiro elemento. Um exemplo: se arrayapontarmos para o local da memória antes do primeiro elemento, converter para uma matriz de um tipo diferente seria problemático, por exemplo. a posição do segundo byte em uma matriz de ints se tornaria dependente do tamanho da palavra; em uma máquina de 32 bits, seria em ((char*)intArray + 5)!!
BlueRaja - Danny Pflughoeft

3
Não, não se trata de saber se a matriz possui um elemento zeroth. Porque, veja você, também há dimensionamento. Se eu tenho uma matriz de objetos de 8 bytes e a sobreponho a uma matriz de bytes, qual é o índice de bytes do objeto [42]? Por que é simples: 42 * 8. O problema de 1 com base é que esse deslocamento de 1 é de 1 byte quando olho para a matriz de bytes e de 8 bytes quando olho para a matriz de unidade de 8 bytes sobreposta.
Kaz

38

Embora os princípios abaixo se apliquem ao decimal, assim como a qualquer outra base, a contagem de 0 em computadores pode ser facilmente entendida naturalmente no sistema binário de dígitos fixos que representa os números usados ​​nos computadores. Se você tiver 8 bits, existem 256 combinações possíveis de 1s e 0s que podem ser expressas. Você pode usar esses 8 bits para expressar os números de 1 a 255, mas isso deixaria de fora 0, o que é útil na matemática como um número em si e, portanto, eles são usados ​​para expressar os números de 0 a 255.

Isso já define um precedente de uma ordem natural começando de 0 (todos os 0 na representação binária) a 255 (todos os 1 em um número de 8 bits). Considerando o sistema de representação de números, a partir de 0 faz sentido porque 0 é o "primeiro" número no sistema, então 1 é o "segundo" número e assim por diante.

Uma razão adicional pela qual a partida do 0 nos computadores é tão conveniente se deve ao conceito de compensações. Um deslocamento é um número que representa a distância de um local na memória ou no disco rígido ou em qualquer outro meio "endereçável". Nos computadores, praticamente todos os dados são armazenados linearmente, o que significa que há uma ordem para os dados, um primeiro byte, um segundo byte, etc. É conveniente expressar a localização de "áreas" de dados por meio de um deslocamento. Qual é o primeiro byte em um bloco de dados? Está no deslocamento '0', o que significa que são encontrados 0 bytes após o primeiro byte no bloco de dados. Embora seja possível que "1" designe o primeiro byte, isso cria complicações na representação dos dados por vários motivos:

  • Com a exclusão de 0 de ser usado para endereçar dados, você reduz o número de itens que pode ser endereçado com um número de 8 bits em um.
  • Para calcular o deslocamento, necessário no nível de hardware do acesso a dados, em algum momento você deve subtrair um da numeração, o que introduz uma complexidade.
  • Os ponteiros para um bloco de dados sempre apontam para o primeiro bloco; portanto, a aritmética é direta quando você inicia a partir de 0. (ou seja, o 1º byte no primeiro bloco do primeiro cluster de dados é 0 + 0 + 0 quando você inicia a partir de 0 , é 1 + 1 + 1 - 1 -1 quando você inicia a partir de 1.) A aritmética para isso quando você inicia a partir de 1 com estruturas de dados aninhadas como este exemplo pode ser confusa.

31
Não tem nada a ver com representação binária. Os números binários e decimais começam em 0.
Matteo

2
Se você começar a contar a partir de 0 você não reduzir o número de endereços que você pode (em teoria) vão de 1 a 257.
Matteo

6
@Matteo não em um único byte que não podia
parar de prejudicar Monica

8
@Dougvj A contagem baseada em zero não tem absolutamente nada a ver com binário. O ponto que você está fazendo é sobre como fazer uso de todos os números em uma representação dígitos fixo, que é uma preocupação, independentemente de você estiver usando base 2, base 10, ou base 23517.
Peter Olson

2
-1 Não tem absolutamente nada a ver com representação binária.
BlueRaja # Danny Pflughoeft

26

Nunca pensei que uma oportunidade para um filósofo de poltrona como eu fosse aparecer em Superuser. Há um equívoco fundamental no coração aqui, porque os não-filósofos tendem a pular os mínimos detalhes. Em resumo: os computadores não contam a partir de zero, mas a denominação das posições começa a partir de zero.

Não há nada de confuso nessa inconsistência percebida entre o computador e as técnicas de contagem humana (qualquer). Vamos decompor a pergunta.

Por que os computadores contam de zero?

  • Eles não contam a partir de zero

Os computadores registram valores começando de zero. Por exemplo, matrizes em C.

  • O índice (indicador de posição, registro) começa do zero. A contagem de elementos em uma matriz em que existe um único elemento no índice zero é um

Zero é prático para representar um vazio de alguma coisa ou o ponto médio de uma escala. Não é prático contar nada, porque é impossível por definição de zero.

No mesmo sentido que o ponto médio de uma escala, o zero pode ser usado para representar a própria aresta (início absoluto) de uma coleção. A questão não tem sentido porque é inconsistente entre "valores de contagem" e "contagem a partir de zero".

Então, sim, os computadores calculam do zero, mas contam de um. As duas palavras têm significado diferente.

tal·ly [tal-ee]

substantivo

  1. uma conta ou acerto de contas; um registro de débito e crédito, da pontuação de um jogo ou algo semelhante.
  2. qualquer coisa em que uma pontuação ou conta seja mantida ..
  3. um número ou grupo de itens registrados.

contagem [ contagem ]

verbo (usado com o objeto)

  1. verificar (as unidades ou grupos separados de uma coleção) um por um para determinar o número total; adicionar; enumerar: Ele contou seus ingressos e descobriu que tinha dez.
  2. calcular; calcular; calcular.
  3. para listar ou nomear os números até: Feche os olhos e conte dez.

(dictionary.com)


As razões práticas são adequadamente descritas por Dougvj, não tenho nada a acrescentar. Se pudéssemos ter um professor de ciências (dos anos 60) para dar um relato histórico ...


De fato, como você sabe onde o computador inicia alguma coisa? Tudo que você sabe é que, quando você o usa, diz para começar do zero.
Daniel R Hicks

Estou falando de definições de conceitos e lógica aqui, não de como os computadores funcionam por si só. Eu sei um pouco sobre onde os computadores iniciam qualquer coisa porque eu participei de cursos de CS.
Ярослав Рахматуллин

11
Para ser completamente pedante, você está comparando um verbo com um substantivo. Eu acho que "registro" e "contagem" são realmente sinônimos, e ambos podem ser usados ​​como verbo ou substantivo.
5133 Brian

11
@ Brian Uma observação justa ee minha intenção é ilustrar (de maneira pedante) que a confusão decorre de uma má interpretação dos termos. Não existe realmente uma diferença entre "o 1º elemento" e "o elemento na posição 0". Ambos são um elemento. O primeiro , não " zeroth ". Não existe contagem a partir de zero . A enumeração começa em uma por definição, enquanto o endereçamento pode ser a-> 1, b-> 2. c-> 3 ou 0-> 1, 1-> 2, 2-> 3. O exemplo mais comum de "contar a partir de zero" pode ser encontrado nos livros de matemática do ensino médio na forma de {x₀, x₁, x₂} - mas o índice é um índice .

11
Só que os designers realmente vagaram um pouco antes de se estabelecerem no esquema atual. O que parece "óbvio" agora não era. E provavelmente um esquema um pouco diferente poderia ter sido escolhido e agora pareceria mais "óbvio" do que o que temos.
Daniel R Hicks

12

Penso que isso já foi coberto pelo " prof.dr. Edsger W. Dijkstra " - Burroughs Research Fellow em uma carta de 11 de agosto de 1982: cf EWD831

Intitulado: Por que a numeração deve começar em zero . "Há razões para preferir uma convenção à outra? Sim, existem ..."

Observe também que Dijkstra estava na equipe de design do ALGOL 68 até o final de 1968. O Algol68 permite matrizes de 0, 1 ou qualquer número que o programador julgar apropriado para o algoritmo. cf ( "The Making of Algol 68" relata "" Você pode definir matrizes triangulares? ", alguém (Tony Hoare?) interrompeu." Não apenas triangular, mas também elíptico ", respondeu Aad e mostrou como. ')

Especificamente, em Algol68, quando as matrizes (e matrizes) são fatiadas, elas obtêm um índice @ 1, então existe um viés em relação às matrizes [1: ...]. Mas o "1 r " limite inferior pode ser movida para iniciar a "0 ° " posição especificando "@ 0", por exemplo vetor x [4: 99 @ 2], y matriz [4: 99 @ 1,4: 99 @ 0]. Da mesma forma, existe um viés / padrão de 1 em loops do ~ od (a menos que " de 0" seja declarado explicitamente) e 1 para o caso inteiro i em ~, ~, ~ esac e $ c (~, ~, ~ ) cláusulas $ choice .

Parece que os comentários de Dijkstra sobre o Relatório preliminar de março de 1968 ( MR93 ) e suas insistências provocaram o que é indiscutivelmente uma guerra de chamas pré-usenet : "existem escritos que são amáveis, embora não gramaticais, e existem outros que são extremamente gramaticais, mas são nojento. Isso é algo que não posso explicar para pessoas superficiais ". EWD230

O Relatório Final Algol 68 (FR) foi publicado em 20 de dezembro de 1968, quando foi reenviado na Reunião de Munique e depois adotado pelo Grupo de Trabalho. Posteriormente, o relatório aprovado pela IFIP da Assembléia Geral da UNESCO para publicação.

Por volta de 23 de dezembro de 1968, Dijkstra, Duncan, Garwick, Hoare , Randell , Seegmuller, Turski, Woodger e Garwick assinaram o AB31.1.1.1 "Minority Report", página 7 (Publicado em 1970).


10

A analogia da distância que alguém mais criou se presta a uma ilustração muito prática:

"A que distância fica sua casa do posto de gasolina mais próximo?"

"1 milha."

"Você mora no posto de gasolina?"

"Não, se eu morasse no posto de gasolina, seriam 0 milhas"

"Por que você está contando do zero ao invés de um?"

Outro bom exemplo seria o aniversário - não dizemos que alguém tem um ano no dia em que nasceu, dizemos que é um ano depois.

Dizemos que os anos bissextos ou as eleições presidenciais dos EUA são a cada quatro anos, mesmo que você conte de um: 2000 , 2001, 2002, 2003, 2004 são cinco anos. (Aliás, os romanos estragaram tudo por um tempo e tiveram anos bissextos muito próximos)

O que quero dizer é que "contamos" a partir de zero o tempo todo no mundo real - "Quantas posições após [início da matriz] é o elemento que você deseja" simplesmente passa a ser a pergunta que você está respondendo com uma contagem de zero em muitos programas de computador. Você não diria que o primeiro elemento é uma posição após o início, diria? Ele é o início.


11
Sua matemática em relação às eleições está fora de um ano. Seu exemplo contém 2 anos eleitorais em um período de 5 anos; a ilustração correta seria que 4 anos passam de uma eleição para a seguinte, ou seja, 2000 -> 2001 (um período de 1 ano), 2001 -> 2002, 2002 -> 2003, 2003 -> 2004.
Jimmy

11
@ Jimmy Esse era o meu ponto - se as pessoas "contassem de uma" no sentido em que desejam computadores, elas contariam 2000 como uma em vez de como zero. Aliás, foi assim que os antigos romanos o fizeram (e de fato descreveriam um ciclo como "2000, 2004, 2008" como um ciclo de cinco anos).
usar o seguinte código

2
Seu exemplo de aniversário não é universalmente verdadeiro. Por exemplo, na Coréia do Sul, o primeiro ano de vida é contado como um em vez de zero .
BennyMcBenBen

6

Como já foi dito por outros computadores, o valor não é zero .

Alguns idiomas indexam de 0. A indexação de 0 tem duas vantagens principais:

  1. Ele é convertido em montagem de maneira natural porque pode ser interpretado como um deslocamento de um ponteiro para a primeira posição.

  2. Você não fica esquisito quando quer negativos. Quantos anos entre 1BC e 1AD? Nenhum. Porque, embora BC seja datas efetivamente negativas, não há ano zero. Se houvesse 0AD, não haveria nenhum problema aqui. Você vê o mesmo problema em toda a ciência, onde as pessoas definiram ingenuamente o primeiro elemento de um conjunto como +1.


Sim, e toda a estupidez de esperar até 2001 pelo novo milênio. Isso confundiu exatamente aquelas pessoas que também não "obtêm" matrizes baseadas em zero quando se envolvem em programação. :)
Kaz

3
Além disso, se "1 milha" significa "bem aqui", então como uma milha tem 1760 pés, significa que "1760 pés" também significa "bem aqui", certo? Errado, "1 pé" significa bem aqui, opa! Neste uma estupidez base, "aqui" é um pé, uma polegada, um centímetro, etc.
Kaz

11
@kaz onde pés => jardas. 1760 jardas em uma milha.
Brad

3

A contagem começa naturalmente em zero

Aqui está o algoritmo para contar maçãs em uma cesta:

count := 0

for each apple in basket
   count := count + 1

Após a execução do acima, countmantém o número de maçãs. Pode ser zero, porque as cestas podem estar vazias.

Se você não usar seu cartão de crédito por um mês inteiro, receberá uma nota de 1 dólar? Ou 1 centavo?

Quando você redefine o medidor de viagem no odômetro do seu carro, ele passa para 0001 ou 0000?

As matrizes podem fornecer várias visualizações dos mesmos dados

Considere uma matriz de estruturas de 32 bits d, cada uma composta por palavras de 16 bits w. Cada palavra é composta de dois bytes de 8 bits b. Sob indexação zero, a sobreposição parece muito conveniente:

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

O objeto de 32 bits, d[1]como no endereço da palavra, w[2]é facilmente calculado multiplicando o índice por 2, que é a proporção dos tamanhos do objeto de 32 e 16 bits. Além disso, no endereçamento de bytes, é b[4].

Isso funciona porque zero é zero, em todas as unidades de medida: byte, palavra, palavra dupla e assim por diante.

Veja o diagrama acima: ele se parece muito com uma régua, onde as conversões de unidades são intuitivas.

Com uma indexação baseada, ele quebra:

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

Agora não podemos simplesmente multiplicar o díndice por 2 para obter o wíndice ou por 4 para obter o bíndice. A conversão entre unidades se torna desajeitada. Por exemplo, para ir de d[2]para b[4], temos que calcular ((2 - 1) * 4) + 1 = 5.

Temos que subtrair esse viés traquinas 1 nas dunidades, fazer o dimensionamento no sistema de coordenadas natural baseado em zero e, em seguida, adicionar novamente o traquinas 1 em bunidades. Observe que não é o mesmo 1! Subtraímos uma largura de palavra dupla, mas adicionamos uma largura de byte .

A conversão entre diferentes visões dos dados se torna algo como a conversão Celsius-Fahrenheit.

Aqueles que dizem que matrizes de base única são fáceis de lidar no nível de implementação, porque há apenas uma subtração simples de 1, estão enganando a si mesmos e a você. Isso é verdade apenas se não fizermos cálculos de dimensionamento entre diferentes tipos de dados. Tais cálculos ocorrem em qualquer programa que tenha uma visão flexível dos dados (por exemplo, um array multidimensional também acessado como um unidimensional) ou que manipule o armazenamento: por exemplo, um alocador de memória, sistema de arquivos ou biblioteca de buffer de quadro de vídeo.

Minimizando dígitos

Em qualquer base, se quisermos usar o menor número de dígitos para implementar um intervalo de valores que é uma potência da base, devemos começar do zero. Por exemplo, na base dez, três dígitos são suficientes para fornecer mil valores distintos de 0 a 999. Se começarmos de 1, excederemos apenas um valor e precisaremos de quatro dígitos.

Isso é importante em computadores, porque o número de dígitos no binário se traduz em linhas de endereço de hardware. Por exemplo, um chip ROM com 256 palavras pode ser endereçado de 0 a 255, o que requer 8 bits: 00000000 a 11111111. Se for endereçado de 1 a 256, serão necessários nove bits. Temos que adicionar desnecessariamente mais um rastreio de endereço à placa de circuito ou ao circuito integrado. Então, o que possivelmente aconteceria na prática seria que 0 seria chamado1 no nível da API do software para acessar esse chip. Uma solicitação para a palavra 1 realmente colocaria 00000000 no barramento de endereço de 8 bits. Ou então, um pedido de 1 se traduziria em endereço 00000001, como esperado, mas um pedido de 256 iria mapear para o endereço de 8 bits de outra forma não utilizado 00000000 em vez do endereço 100000000. Ambos os kludges-mordendo saco de 9 bits são realmente soluções em pesquisa de um problema e são evitados inteiramente usando 0 a 255 consistentemente no hardware, no software e em todas as interfaces e documentação do usuário.

Deslocamentos de base única são fundamentalmente estúpidos

Considere a teoria musical ocidental, por exemplo. Temos escalas diatônicas com sete notas, mas chamamos o espaço que elas cobrem uma oitava ! A inversão de intervalos segue a regra dos nove : por exemplo, a inversão de um terço é um sexto (subtrai três de nove). Então, três números diferentes estão em jogo para algo tão simples: sete (notas em uma escala), oito (oitava) e nove (subtrair de para inverter).

Se sete notas fizessem uma oitava ou hepta e os intervalos fossem baseados em zero, subtraímos de sete para inverter. Tudo baseado em sete.

Além disso, os intervalos podem ser facilmente empilhados. No sistema atual, se saltamos um quinto e depois um quarto novamente, e depois um terço, não podemos apenas adicioná-los. O intervalo resultante é dois a menos. Não é um décimo segundo, mas na verdade um décimo! Em cada estágio, temos que subtrair um. Subir um quinto e depois um quarto não é o nono, mas apenas uma oitava.

Em um sistema de música projetado de maneira saudável, podemos adicionar intervalos para determinar os saltos resultantes. Uma sequência de notas que começa e termina na mesma nota teria então uma propriedade semelhante à lei de tensão em torno de um circuito: todos os intervalos seriam adicionados a zero.

A teoria musical e a escrita estão desatualizadas. A maior parte não mudou desde os dias em que a composição era feita com canetas de pena à luz de uma vela.

Os sistemas de base única confundem as mesmas pessoas que não conseguem lidar com matrizes de base zero

Quando o ano de 2000 chegou, muitas pessoas ficaram confusas por que o novo milênio não começou. Aqueles que afirmam que não começará antes de 2001 foram considerados cocô e babacas. Afinal, você está na casa dos 20 quando faz 20 anos, certo? Não quando você completa 21 anos. Se você pensou que o milênio começou em 1º de janeiro de 2000, não tem o direito de reclamar de matrizes baseadas em zero em qualquer linguagem de programação. Eles funcionam exatamente como você gosta. (Mas, sim, os defensores de deslocamentos e matrizes baseados em uma só pessoa são bobos e cocô de festas. Os séculos devem começar nos anos XX00 e milênios nos anos X000.)

Os calendários são burros, mas pelo menos a hora do dia é baseada em zero

Cada novo minuto no seu relógio começa com: 00 segundos. Cada nova hora começa com 00:00 minutos e segundos. E, pelo menos em um relógio de 24 horas, o dia passa quando a meia-noite ocorre e 11:59:59 aumenta para 00:00:00.

Portanto, se você deseja calcular segundos a partir da meia-noite para um horário como 13:53:04, basta avaliar 13 * 3600 + 53 * 60 + 4. Nenhuma 1adição ou subtração insípida .

Discurso de encerramento sobre MIDI

Ok, o que há com músicos, mesmo supostamente técnicos?

MIDI! Ele usa numeração com base em zero para programas e canais na representação real de mensagens, mas a engrenagem exibe como 1! Por exemplo, os programas de 0 a 127 são chamados de 1 a 128 na maioria dos equipamentos, mas alguns os chamam de 0 a 127 ou até oferecem ao usuário uma escolha.

Os programas 71 a 80 são considerados um "banco" de dez. É o que diz no meu pedal MIDI, por exemplo. Os pedais são rotulados de 1 a 10 e, se eu estiver no sétimo banco, eles escolhem os programas 71 a 80. No entanto, alguns dispositivos ou software de computador exibem os números de programas 1-128 como 0 a 127, ou até dão ao usuário uma escolha! O que é pior: sistemas baseados em um ou caos criado usando um e zero ao mesmo tempo?

Os números dos canais MIDI são chamados de 1 a 16, mas são representados por 0 a 15 binários. Como se não fosse a apresentação baseada em um, alguns equipamentos usam um dispswitch para configurar um número de canal e, freqüentemente, esses comutadores usam apenas o código binário baseado em zero. Portanto, se você deseja o canal 3, deve alterná-lo para 0010 (binário 2).


1

Se bem me lembro da minha classe de conceitos de linguagem de programação ... idiomas sendo indexados 0 e outros sendo 1 indexados tinham a ver com razões históricas. Algol-68, o avô das linguagens de programação, na verdade, era indexado a 1, assim como o Fortran e algumas outras linguagens "comerciais", como COBOL. Entretanto, em alguns desses idiomas, você pode especificar explicitamente qual seria o seu índice inicial. Há uma tabela interessante disso aqui .

Basicamente, nos matemáticos, cientistas e outros "acadêmicos" dos " Ye Olde Days ", usavam-se idiomas indexados 0, enquanto usuários de idiomas como o COBOL achavam inútil começar a contar com 0; portanto, nesses idiomas, fazia mais sentido começar em 1 (parecia menos confuso).

Agora, se sua pergunta se refere ao porquê de um computador ( não um idioma ) naturalmente começar a contar a partir de zero ... bem, acho que inerente ao binário: ex: 0000= zero 0001= um ... assim por diante adiante...


4
Não tem nada a ver com representação binária. Os números binários e decimais começam em 0 (como você mostra no seu exemplo).
precisa

Bem, tem algo mais a ver com binário. Com quatro bits, de 0000 a 1111, você pode endereçar um banco de memória de 16 palavras. Se você fizer isso com base única, precisará de cinco linhas de endereço para representar 0001 a 10000. Caso contrário, você faz o que, por exemplo, o MIDI faz com os números de canal: 0000 é usado internamente, mas as interfaces do usuário mostram 1! Se o hardware fosse decimal, seria o mesmo problema. Três dígitos fornecem mil endereços se você começar do zero, mas se você começar do 1, precisará de quatro dígitos.
Kaz

1

O número 0 pode indicar vários significados: valor numérico, ordinal, endereço de memória etc.

'Índice zero' não significa que os programadores contam a partir de zero. Ele indica o primeiro local de um bloco de memória alocado e '0' é o endereço dele.

Em C, o loop através de uma matriz pode ser escrito como abaixo:

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

O mesmo trabalho pode ser feito em C #:

Object[] arr;

for (Object o in arr) {
...
}

Eu acho que não há contagem nos dois exemplos.


1

Começar do zero é prático ao descrever a distância de alguma coisa. Portanto, nesta matriz:

[4,9,25,49]

a distância entre o início da matriz e os 25 é 2 - é necessário pular duas etapas para chegar lá. A distância para o 4 é zero - você não precisa se mover desde o início.

É prático pensar assim ao somar distâncias (ou índices) - eu avanço um passo, depois zero passos, depois dois passos, onde estou? Estou no índice 1 + 0 + 2 = 3. Ignorando três etapas, termino em 49 na matriz acima.


A contagem de pisos em um prédio deve ser realmente da mesma maneira (embora não o façamos dessa maneira nos EUA). O nível do solo deve ser zero porque você não subiu nem desceu; é uma posição inicial.

No entanto, o térreo é o primeiro a chegar. Você começa a contar quando entra no prédio, no térreo, e adiciona à medida que sobe. Começar do zero faz sentido se você considerar "em um edifício" o estado padrão / normal / natural, que é um comentário interessante sobre a sociedade urbana. Zero para o nível do solo também faz muito sentido se vários subníveis forem comuns.

1

Lembre-se de como os números são representados em um computador. Vamos pegar uma bytevariável. 0 é representado como 00000000 1 em binário. 1 é 00000001. 2 é 00000010. E assim por diante.

Observe que o número mais baixo que um bytepode armazenar é 0. Se começássemos os índices de matriz com 1, o sistema seria ineficiente, já que agora temos uma matriz de comprimento 255 em vez de 256. Como os números em um programa C são compilados em números binários ( ints geralmente, unsigned ints em índices de matriz), parece natural usar 0 como índice inicial, pois é mais eficiente.

Além disso, em C ++, a[p]se desdobra em *(a+p*n), onde nestá o tamanho do tipo de dados. Em outras palavras, a[p]significa "Dê-me o elemento no índice a+n*p". Se piniciado 1, teríamos uma parte em branco / não utilizada no índice a.

1. Obviamente, a pergunta óbvia "por que" surge. Por que não definir 00000000 como 1? Simples: a adição binária (feita por cascatas de unidades somadoras completas) é fácil no hardware quando 00000000 é 0. A adição binária é parte integrante de todas as operações aritméticas. Se você o fizer representar 1, precisará instruir o compilador a subtrair 1 de todos os números, ou precisará conectar os circuitos do somador para subtrair um primeiro dos adendos e fixá-lo novamente na soma. (observe que você não pode subtrair um posteriormente, pois o bit de transporte pode estar envolvido)


@sec porque isso se torna absurda a nível de hardware (ver edição)
Manishearth

1

Módulo

Uma coisa que as boas respostas existentes ainda não mencionam: a indexação baseada em zero funciona bem em conjunto com as operações do módulo, que podem, portanto, ser combinadas para formar uma lista cíclica. Pense, por exemplo, em algo como

color = colors[i % colors.length]

que pode dar a cada objeto (indexado por i) uma cor diferente da lista colors, até que todas as cores tenham sido usadas; nesse ponto, ele recomeçaria do início. Expressar o mesmo na indexação baseada em uma é bastante desajeitado:

color = colors[(i - 1) % colors.length + 1]

As operações automáticas do módulo impostas pela aritmética binária sem sinal de tamanho fixo com wrap-around são outro exemplo de por que isso faz sentido.

Atende a ambos

Outra coisa a considerar é o fato de que é muito fácil não usar o primeiro elemento de uma matriz baseada em zero. (Isso não se aplica à foreachiteração no estilo e às construções de linguagem semelhantes que tratam a matriz como um todo.) Muitos programadores, inclusive eu, podem se sentir um pouco desconfortáveis ​​com o espaço desperdiçado, mas na maioria das situações a quantidade é tão pequena que isso preocupa. são infundados. Por outro lado, se os idiomas estiverem usando a indexação baseada em um, não há como simular um elemento no índice zero sem muito código. Dado que, em algumas situações, a indexação baseada em zero é melhor que a baseada em uma, escolhendo zero como base em todos os lugares é a abordagem mais flexível, em oposição à baseada em uma única parte, e também é mais consistente do que as posições iniciais configuráveis.


0

Os sistemas de computador usam números naturais (contando de 0) e números inteiros (contando de 1). As pessoas contam coisas em números inteiros, o que as torna intuitivas para listas de numeração, e muitas linguagens de programação se beneficiam disso: BASIC, COBOL, Fortran, Lua e Pascal, todas contam a partir de 1. Essas linguagens têm como alvo nichos como processamento de dados, análise numérica, e ensino, onde listas simples e intuitivas são uma vantagem.

Números inteiros se tornam estranhos quando você começa a analisar e manipular a estrutura dos dados, em vez de apenas processar tudo em ordem. Quando você precisa se referir a seqüências em uma fórmula ou algoritmo, é mais fácil e menos propenso a erros numerá-las de 0, como os matemáticos fazem: a 0 , a 1 , a n etc. Caso contrário, você deve ajustar com +1 e –1 para obter os dados corretos e é fácil cometer erros, criando bugs. Portanto, as linguagens projetadas para cientistas da computação geralmente usam números naturais: C, Java e Lisp, todos contam com 0.

Além das linguagens de programação, muitos sistemas de computador numeram 0, porque é a isso que os cientistas da computação estão acostumados. Além disso, como a numeração de 1 leva a muitos erros traiçoeiros, muitos de nós a evitam fora dos elementos da interface projetados estritamente para usuários finais não técnicos.


Java ... para cientistas da computação. RI MUITO!
Kaz

0

A resposta simples é que o primeiro numeral não é 1, é 0.

Explicação: A fórmula para calcular um número de vários dígitos em qualquer base é:

n = sum(i=0 to n, Di^i)

WHERE 
n = numeric result
i = index (starting with 0)
Di = is the digit at index i

Vamos usar o sistema decimal, é o que estamos mais acostumados.

Olhando o número 1234, podemos escrevê-lo como:

4 x 10^0 = 4
3 x 10^1 = 30
2 x 10^2 = 200
1 x 10^3 = 1000

in other words, sum of digits raised to the power if their index.

Portanto, não são apenas os computadores, nós, as pessoas, contamos também com 0.


0

Um índice de matriz é o deslocamento da localização da memória base para a localização da memória do elemento. O elemento i é então Base + i. O primeiro elemento está localizado no local Base, portanto, no local 0 (Base + 0).


0

Além da eficiência computacional, há também outro aspecto na contagem. Existem duas maneiras de atribuir a cada elemento em uma sequência um número seqüencial:

  1. O número de elementos (inteiros) anteriores (números cardinais)
  2. A posição do elemento (números ordinais)

A idade das pessoas é um número fundamental: no primeiro ano após o nascimento de um bebê, ele tem 0 anos, porque vive há zero anos inteiros.

Os anos em datas são números ordinais: no primeiro ano em Anno Domini (AD), o ano é 1 AD. Não há ano 0, assim como não há zeroth nada.

As linguagens de programação (como Matlab e Mathematica) em que o índice de um elemento representa sua posição na matriz começam a contar de 1: o primeiro elemento. Em outros idiomas (como todos os idiomas baseados em C), o índice de um elemento é o número de elementos anteriores e, portanto, o primeiro elemento é 0.


Obviamente, Matteo está apenas parcialmente correto ao afirmar que a indexação baseada em zero é mais eficiente.

element(n) = address + n * element_size

A indexação baseada em uma pode ser igualmente eficiente, desde que todos os endereços da matriz já tenham um element_sizesubtraído deles. Isso pode ser feito quando a matriz é alocada; nesse caso, é tão rápido quanto:

array_address = address - element_size
element(n) = array_address + n * element_size

-1

Os computadores tradicionalmente registram valores numéricos a partir de zero. Por exemplo, matrizes em linguagens de programação baseadas em C começam no índice zero.

0 ... Você está bagunçando conceitos diferentes: linguagens de programação, computadores e contagem.

  1. O uso de 2 estados (a maioria deles faz esquematicamente exatamente isso) significa que você pode escolher 2 dígitos para os mapear (para, por exemplo, referir). "3" e "5" (ou "F" e ",") seriam aceitáveis, mas você perguntaria por que os computadores contam entre "3" (ou "F"). A escolha natural é 0 e 1, obviamente.
  2. As matrizes em Pascal começam a partir de 1. Esse idioma é um pouco mais abstrato que o C de baixo nível.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.