valor máximo de número inteiro

291

Em C, o número inteiro (para máquina de 32 bits) é de 32 bits e varia de -32.768 a +32.767. Em Java, o número inteiro (longo) também possui 32 bits, mas varia de -2.147.483.648 a +2.147.483.647.

Eu não entendo como o intervalo é diferente em Java, mesmo que o número de bits seja o mesmo. Alguém pode explicar isso?

stackuser
fonte
35
Para obter os valores máximo e mínimo de int em Java, o uso Integer.MAX_VALUE e Integer.MIN_VALUE
live-amor
5
@stackuser - Algumas boas respostas à sua pergunta - você deve aceitar um :)
Darragh Enright
2
@DarraghEnright ele foi visto pela última vez em março de 2015, duvido que ele volte :(
Ungeheuer 25/16
4
@ Adrian haha ​​- acho que não! Acontece um pouco, suponho. Eu sempre imaginei que o SO poderia facilmente aceitar respostas automaticamente sob certas condições - onde a pergunta está acima de uma certa idade, o OP está AWOL e há uma resposta claramente útil com um número alto de votos.
Darragh Enright
2
@DarraghEnright Concordo. Mas a OP estava aqui ~ duas semanas atrás, ele teve a chance de aceitar, então tecnicamente ele não está fora.
9788 gaborsch

Respostas:

392

Em C , o próprio idioma não determina a representação de certos tipos de dados. Pode variar de máquina para máquina, em sistemas embarcados intpode ter uma largura de 16 bits, embora geralmente seja de 32 bits.

O único requisito é que short int<= int<= long intpor tamanho. Além disso, há uma recomendação que intdeve representar a capacidade nativa do processador .

Todos os tipos são assinados. O unsignedmodificador permite que você use o bit mais alto como parte do valor (caso contrário, ele é reservado para o bit de sinal).

Aqui está uma tabela curta dos valores possíveis para os possíveis tipos de dados:

          width                     minimum                         maximum
signed    8 bit                        -128                            +127
signed   16 bit                     -32 768                         +32 767
signed   32 bit              -2 147 483 648                  +2 147 483 647
signed   64 bit  -9 223 372 036 854 775 808      +9 223 372 036 854 775 807
unsigned  8 bit                           0                            +255
unsigned 16 bit                           0                         +65 535
unsigned 32 bit                           0                  +4 294 967 295
unsigned 64 bit                           0     +18 446 744 073 709 551 615

Em Java , a Java Language Specification determina a representação dos tipos de dados.

A ordem é: byte8 bits, short16 bits, int32 bits, long64 bits. Todos esses tipos são assinados , não há versões não assinadas. No entanto, manipulações de bits tratam os números como não assinados (ou seja, manipulando todos os bits corretamente).

O tipo de dados do caractere chartem 16 bits de largura, não assinado e retém caracteres usando a codificação UTF-16 (no entanto, é possível atribuir um charnúmero inteiro arbitrário e não assinado de 16 bits que represente um ponto de código inválido)

          width                     minimum                         maximum

SIGNED
byte:     8 bit                        -128                            +127
short:   16 bit                     -32 768                         +32 767
int:     32 bit              -2 147 483 648                  +2 147 483 647
long:    64 bit  -9 223 372 036 854 775 808      +9 223 372 036 854 775 807

UNSIGNED
char     16 bit                           0                         +65 535
gaborsch
fonte
10
O padrão C também especifica valores mínimos para INT_MAX, LONG_MAX, etc
Oliver Charlesworth
13
Java 8 possui agora não assinado inteiro, bem como: docs.oracle.com/javase/8/docs/api/java/lang/Integer.html
Jakub Kotowski
4
Obrigado, @jkbkot, bom saber disso. Embora pareça que a representação ainda esteja assinada, algumas operações não assinadas são implementadas como uma função. É difícil para adicionar dois não assinados ints ...
gaborsch
5
@GaborSch Em Java, int foo = Integer.MAX_VALUE + 1; System.out.println(Integer.toUnsignedLong(foo));impressões 2147483648e carvão é um tipo não assinado
howlger
2
@howlger Integer.MAX_VALUE + 1está 0x80000000em hexadecimal, devido ao estouro (e é igual a Integer.MIN_VALUE). Se você convertê-lo em não assinado (longo), o bit de sinal será tratado como um valor, assim será 2147483648. Obrigado pela charnota. charestá sem assinatura, você está certo, mas o char não é realmente usado para cálculos, é por isso que o deixei da lista.
Gaborsch #
72

Em C, o número inteiro (para máquina de 32 bits) é de 32 bits e varia de -32768 a +32767.

Errado. O inteiro assinado de 32 bits na representação do complemento de 2 tem o intervalo -2 31 a 2 31 -1, que é igual a -2.147.483.648 a 2.147.483.647.

Kos
fonte
3
Corrigi sua exponenciação, **não é nem C e não é muito claro na minha opinião. :)
descontraia
2
Parece melhor agora, obrigado! Python demais, suponho. I evitar ^, já que é geralmentexor
Kos
5
Penso que meu argumento é que, como C não possui um operador de exponenciação, não acho que essa peça em particular deva ser formatada como código. :)
descontraia
19

Um número inteiro de 32 bits varia de -2.147.483.648 a 2.147.483.647. No entanto, o fato de você estar em uma máquina de 32 bits não significa que o Ccompilador use números inteiros de 32 bits.

Ivaylo Strandjev
fonte
1
Pelo menos minha cópia do Sr. Kernighan e Sr. Ritchies "A linguagem de programação C" diz em A4.2 que inté da "largura natural da máquina" que eu interpretaria como 32 bits ao compilar para máquinas de 32 bits.
junix
7
Isso depende do compilador, não da máquina em que acredito. Eu tinha um compilador de 16 bits instalado na minha máquina de 64 bits, por exemplo.
Ivaylo Strandjev
Obviamente, seu compilador de 16 bits para código x86 de 16 bits usou apenas 16 bits. Mas esse não era o meu ponto. Mesmo um processador x86 de 32 bits em execução no modo de 16 bits tem apenas uma capacidade nativa de apenas 16 bits. O que quero dizer é que a plataforma de destino do compilador é importante. Por exemplo, se você tiver um compilador para o seu 80286, ainda gerará código de 16 bits e, portanto, terá números inteiros de 16 bits.
junix
2
@ Junix Eu acredito que é exatamente o que eu aponto na minha resposta. Não é o sistema operacional que especifica quantos bits seus números inteiros possuem. A plataforma de destino é uma propriedade do compilador, não do sistema operacional em que está trabalhando ou do processador que você possui.
Ivaylo Strandjev
Como escrevi no meu primeiro comentário. "São 32 bits ao compilar para máquinas de 32 bits". O OP escreve em sua postagem "o número inteiro (para máquina de 32 bits)" Então, pelo que entendi, ele não está se referindo ao seu sistema operacional ou à sua máquina, ele está se referindo à sua plataforma de destino
junix
15

A definição da linguagem C especifica intervalos mínimos para vários tipos de dados. Pois int, esse intervalo mínimo é de -32767 a 32767, o que significa que um intdeve ter pelo menos 16 bits de largura. Uma implementação é livre para fornecer um inttipo mais amplo com uma faixa correspondentemente mais ampla. Por exemplo, no servidor de desenvolvimento SLES 10 em que trabalho, o intervalo é de -2147483647 a 2137483647.

Ainda existem alguns sistemas por aí que usam inttipos de 16 bits (todo o mundo não é um VAX x86), mas há muitos que usam inttipos de 32 bits e talvez alguns que usam 64 bits.

A linguagem C foi projetada para rodar em diferentes arquiteturas. O Java foi projetado para ser executado em uma máquina virtual que oculta essas diferenças arquiteturais.

John Bode
fonte
Para int de 16 bits, é -3276 8 a 32767. Para int de 32 bits, é -214748364 8 a 2147483647. O intervalo é especificado de -2 ^ (n bits-1) a + 2 ^ (n bits-1 ) - 1.
mythicalcoder
3
@Maven: 5.2.4.2.1 - INT_MINé especificado como -32767. Não assuma o complemento de dois.
John Bode
8

O equivalente estrito do java intestá long intem C.

Edit: Se int32_tfor definido, é o equivalente em termos de precisão. long intgaranta a precisão do java int, porque é garantia ter pelo menos 32 bits de tamanho.

UmNyobe
fonte
você está certo, o equivalente é int32_tse ele é definido pelo seu compilador
UmNyobe
7

Isso porque em C - inteiro na máquina de 32 bits não significa que 32 bits sejam usados ​​para armazená-lo, pode ser 16 bits também. Depende da máquina (depende da implementação).

BlueLettuce16
fonte
1
Bem, vale ressaltar que o comportamento típico de implementação está usando "largura da máquina" para int. Mas limits.hajuda a descobrir qual é a verdade exata
junix
3
Mas, na realidade, eu não acho que um compilador C para 32 já tenha sido feito sem int como 32 bits. O padrão pode permitir que a implementação do compilador int seja de natureza imbecil, mas, por alguma razão, ninguém quer criar um compilador imbecil C. A tendência é criar compiladores C úteis.
Lundin
4

Na verdade, o tamanho em bits do int, short, long depende da implementação do compilador.

Por exemplo, no meu Ubuntu de 64 bits eu tenho shortem 32bits, quando em outra versão de 32 bits do Ubuntu é 16bit.

Alex
fonte
2

É realmente muito simples de entender, você pode até calculá-lo com a calculadora do Google: você tem 32 bits para um int e os computadores são binários; portanto, você pode ter 2 valores por bit (spot). se você calcular 2 ^ 32, obterá os 4.294.967.296. portanto, se você dividir esse número por 2 (porque metade deles é um número inteiro negativo e a outra metade é positiva), obtém 2.147.483.648. e esse número é o maior int que pode ser representado por 32 bits, embora, se você prestar atenção, perceberá que 2.147.483.648 são maiores que 2.147.483.647 por 1, isso ocorre porque um dos números representa 0, o que está exatamente no meio, infelizmente 2 ^ 32 não é um número ímpar, portanto, você não possui apenas um número no meio; portanto, os números inteiros possíveis têm uma cifra a menos, enquanto os negativos obtêm a metade completa 2.147.483.648.

E é isso. Depende da máquina e não do idioma.

Emos Turi
fonte
2
Não foi isso que ele pediu ... a pergunta é "por que C int é diferente de Java int?"
ElectronWill
E em Java, o tamanho de int não depende da máquina. int== 32 bits assinado, complemento dois é definido pela especificação da linguagem Java e gravado em folhas de unobtainium anodizado . (OK, talvez não seja a última parte.)
Stephen C
1

No intervalo C para __int32, é –2147483648 a 2147483647. Veja aqui para intervalos completos.

unsigned short 0 to 65535
signed short 32768 to 32767
unsigned long 0 to 4294967295
signed long 2147483648 to 2147483647

Não há garantias de que um 'int' seja de 32 bits; se você quiser usar variáveis ​​de um tamanho específico, principalmente ao escrever código que envolva manipulação de bits, use os 'Tipos de número inteiro padrão'.

Em Java

O tipo de dados int é um inteiro de complemento assinado por dois de 32 bits. Tem um valor mínimo de -2.147.483.648 e um valor máximo de 2.147.483.647 (inclusive).

Achintya Jha
fonte
2
Os valores que você cita para C são apenas intervalos mínimos.
Oliver Charlesworth
@OliCharlesworth Faixa se do mínimo ao máximo.
Achintya Jha
6
O que quero dizer é que o intervalo para cada tipo pode ser maior do que o que você citou acima.
Oliver Charlesworth
3
Não há nada em C chamado __int32. A Microsoft não possui um compilador C em conformidade estrita, então quem se importa com o funcionamento de seu compilador não-C? A única fonte relevante é a ISO9899, ​​5.2.4.2.1 "Tamanhos de tipos inteiros" ou 7.20.2.1 "Limites de tipos inteiros de largura exata". Nada disso é compatível com o Microsoft goo.
Lundin
2
O C99 adiciona int32_t, int16_t etc. ao padrão. Não é 100% compatível com as adições da Microsoft, mas elas funcionam de maneira semelhante.
Pergunte sobre Monica
-1

no padrão C, você pode usar INT_MAX como o valor máximo 'int', essa constante deve ser definida em "limits.h". Constantes semelhantes são definidas para outros tipos ( http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.5.html ), conforme declarado, essas constantes dependem da implementação, mas têm um valor mínimo de acordo com os bits mínimos para cada tipo, conforme especificado na norma.

Carlos UA
fonte
5
Isso não chega a resolver a questão do OP. Além disso, partes principais de uma resposta realmente não devem ser enterradas em outro site.
Brad Koch