Articles

Valor Máximo de um Número Inteiro: Java Vs C vs Python

Introdução

Em Ciência de Dados, quando falamos de inteiros, estamos a referir-nos a um tipo de dados que representa alguma gama de inteiros matemáticos. Sabemos que os inteiros matemáticos não têm um limite superior, mas isto pode ser um problema em termos de tamanho de memória, forçando quase todas as arquitecturas de computadores a limitar este tipo de dados.

Então, esta é a pergunta que estamos a tentar fazer hoje: “Qual é o valor inteiro máximo que podemos representar numa determinada máquina?”

Explicação do problema

Bem, não há uma resposta única a esta pergunta, uma vez que há muitos factores que influenciam a resposta. Os principais são:

  • Bits de plataforma
  • Língua utilizada
  • Versões assinadas ou não assinadas

Na informática, a representação mais comum de inteiros é por um grupo de dígitos binários (bits), armazenados como um sistema numérico binário. A ordem dos bytes de memória varia – com n bits, podemos codificar 2^n inteiros.

Podemos ver as diferenças neste exemplo simples: com n bits, podemos codificar números inteiros de 0 a 2^n - 1 ou de - 2^{n-1} a .

Usualmente, o tamanho inteiro n é definido pela arquitectura da máquina, mas algumas linguagens de computador também definem os tamanhos inteiros independentemente. CPUs diferentes suportam diferentes tipos de dados, com base na sua própria plataforma. Tipicamente, todas suportam tanto tipos assinados como não assinados, mas apenas de um conjunto limitado e fixo de larguras, normalmente 8, 16, 32 e 64 bits.

algumas línguas definem dois ou mais tipos de tipos de dados inteiros, um mais pequeno para preservar a memória e levar menos armazenamento, e um maior para melhorar a gama suportada.

Outra coisa a ter em mente é o Tamanho da Palavra (também chamado Comprimento da Palavra) da plataforma.

Na informática, uma palavra é a unidade de dados utilizada por um determinado desenho de processador, uma peça de dados de tamanho fixo tratada como uma unidade pelo hardware do processador. Quando falamos de tamanho de palavra, referimo-nos ao número de bits de uma palavra e esta é uma característica crucial de qualquer arquitectura informática específica e concepção de processador.

Acturas actuais têm tipicamente um tamanho de palavra de 64 bits, mas existem também algumas com 32 bits.

Tempo para as respostas

Nesta secção, vamos responder às nossas perguntas desde o velho amigo C até ao relativamente novo Python, passando pelo sempre-verde Java. Vamos começar.

3.1. C

A linguagem C foi concebida em 1972, com o objectivo de trabalhar da mesma forma em diferentes tipos de máquinas. Assim, não determina directamente um intervalo para o tipo de dados inteiros, pois isso depende da arquitectura da máquina.

No entanto, C tem dois tipos de inteiros; curto e longo.

Um número inteiro curto é, pelo menos, 16 bits. Portanto, numa máquina de 16 bits, coincide com o formato de um inteiro longo. O formato de número inteiro curto varia de -32.767 a 32.767 para a versão assinada e de 0 a 65.535 para a não assinada. Bem, é estranho, mas parece que para a versão assinada nos falta um número. Que é fácil de explicar: porque precisamos de um bit para o sinal!

Se corrermos num sistema de 64 bits, podemos facilmente calcular que o formato longo pode atingir um valor 2^{64-1}, que corresponde a 18,446.744.073.709.551.615 para o tipo de dados não assinados e varia de -9.223.372.036.854.775.807 a 9.223.372.036.854.775.807 na versão assinada.

Para completar, faremos uma pequena viagem no longo tipo de dados inteiros. O formato longo não está disponível em C, mas apenas na versão C99. Tem o dobro da capacidade de memória de um tipo de dados longos, mas obviamente não é suportado por compiladores que requerem o padrão C anterior. Com o tipo de dados longos, podemos atingir um enorme 2^{64-1} se o estivermos a executar numa máquina de 32-bit ou superior.

3.2. Java

Falando de Java, devemos lembrar que funciona através de uma máquina virtual. Isso poupa-nos de toda a variabilidade explicada para a linguagem C.

Java suporta apenas versões assinadas de números inteiros. E são:

  • byte (8 bits)
  • curto (16 bits)
  • int (32 bits)
  • longo (64 bits)

Assim, com o formato inteiro longo podemos alcançar 2^{64-1} como com C numa máquina de 64 bits mas, desta vez, em cada arquitectura de máquina.

No entanto, com alguma manipulação de bits, podemos obter versões não assinadas, graças ao formato char. É um formato de 16 bits, pelo que o formato inteiro não assinado pode atingir 65.535,

Mas com Java, podemos ir mais longe com um pequeno hack para podermos representar números inteiros muito grandes através da biblioteca de classes BigInteger. Esta biblioteca combina matrizes de variáveis menores para construir números enormes. O único limite é a memória física, pelo que podemos representar uma gama enorme, mas ainda limitada, de inteiros.

Por exemplo, com 1 kilobyte de memória, podemos alcançar inteiros até 2.466 dígitos de comprimento!

3.3. Python

Python suporta directamente inteiros de precisão arbitrária, também chamados inteiros de precisão infinita ou bignums, como uma construção de nível superior.

Isto significa, como com o Java BigInteger, usamos tanta memória quanto a necessária para um inteiro arbitrariamente grande. Assim, em termos de linguagem de programação, esta pergunta não se aplica de todo ao Python, porque o tipo de inteiro simples é, teoricamente não limitado.

O que não é não limitado é o tamanho de palavra do intérprete actual, que é o mesmo que o tamanho de palavra da máquina na maioria dos casos. Essa informação está disponível em Python como sys.maxsize, e é o tamanho da maior lista ou sequência in-memory possível, que corresponde ao valor máximo representável por uma palavra assinada.

Numa máquina de 64 bits, corresponde a 2^{64-1} = 9,223,372,036,854,775,807.

Flowchart

Vejamos um fluxograma para resumir o que vimos até agora:

h2>Código Real para Cada Língua

Aqui está um código real para verificar directamente o que discutimos até agora. O código demonstrará os valores máximos e mínimos de inteiros em cada língua.

Desde que esses valores não existam em Python, o código mostra como mostrar o tamanho da palavra do intérprete actual.

5.1. C Código

#include<bits/stdc++.h>int main() { printf("%d\n", INT_MAX); printf("%d", INT_MIN); return 0; }

5.2. Código Java

public class Test { public static void main(String args) { System.out.println(Integer.MIN_VALUE); System.out.println(Integer.MAX_VALUE); }}

5.3. Python Code

import platformplatform.architecture()import syssys.maxsize

Conclusion

Neste artigo, cobrimos as diferenças entre estas três línguas superiores sobre o maior número possível de inteiros. Também mostrámos como esta pergunta não se aplica em algumas situações.

No entanto, deve-se usar sempre o melhor ajuste na sua situação para evitar o consumo de memória e o atraso do sistema.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *