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?
Respostas:
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
int
pode ter uma largura de 16 bits, embora geralmente seja de 32 bits.O único requisito é que
short int
<=int
<=long int
por tamanho. Além disso, há uma recomendação queint
deve representar a capacidade nativa do processador .Todos os tipos são assinados. O
unsigned
modificador 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:
Em Java , a Java Language Specification determina a representação dos tipos de dados.
A ordem é:
byte
8 bits,short
16 bits,int
32 bits,long
64 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
char
tem 16 bits de largura, não assinado e retém caracteres usando a codificação UTF-16 (no entanto, é possível atribuir umchar
número inteiro arbitrário e não assinado de 16 bits que represente um ponto de código inválido)fonte
int
s ...int foo = Integer.MAX_VALUE + 1; System.out.println(Integer.toUnsignedLong(foo));
impressões2147483648
e carvão é um tipo não assinadoInteger.MAX_VALUE + 1
está0x80000000
em hexadecimal, devido ao estouro (e é igual aInteger.MIN_VALUE
). Se você convertê-lo em não assinado (longo), o bit de sinal será tratado como um valor, assim será2147483648
. Obrigado pelachar
nota.char
está sem assinatura, você está certo, mas o char não é realmente usado para cálculos, é por isso que o deixei da lista.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.
fonte
**
não é nem C e não é muito claro na minha opinião. :)^
, já que é geralmentexor
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
C
compilador use números inteiros de 32 bits.fonte
int
é da "largura natural da máquina" que eu interpretaria como 32 bits ao compilar para máquinas de 32 bits.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 umint
deve ter pelo menos 16 bits de largura. Uma implementação é livre para fornecer umint
tipo 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
int
tipos de 16 bits (todo o mundo não é umVAXx86), mas há muitos que usamint
tipos 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.
fonte
INT_MIN
é especificado como-32767
. Não assuma o complemento de dois.O equivalente estrito do java
int
estálong int
em C.Edit: Se
int32_t
for definido, é o equivalente em termos de precisão.long int
garanta a precisão do javaint
, porque é garantia ter pelo menos 32 bits de tamanho.fonte
int32_t
se ele é definido pelo seu compiladorIsso 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).
fonte
int
. Maslimits.h
ajuda a descobrir qual é a verdade exataO pôster tem seus tipos de java misturados. em java, seu C in é curto: curto (16 bits) = -32768 a 32767 int (32 bits) = -2.147.483.648 a 2.147.483.647
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
fonte
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
short
em32
bits, quando em outra versão de 32 bits do Ubuntu é16
bit.fonte
É 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.
fonte
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.)No intervalo C para __int32, é –2147483648 a 2147483647. Veja aqui para intervalos completos.
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).
fonte
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.
fonte