En C, el número entero (para la máquina de 32 bits) es de 32 bits y oscila entre -32,768 y +32,767. En Java, el entero (largo) también es de 32 bits, pero varía de -2,147,483,648 a +2,147,483,647.
No entiendo cómo el rango es diferente en Java, a pesar de que el número de bits es el mismo. ¿Alguien puede explicar esto?
Respuestas:
En C , el lenguaje en sí no determina la representación de ciertos tipos de datos. Puede variar de máquina a máquina, en sistemas integrados
int
puede tener 16 bits de ancho, aunque generalmente es de 32 bits.El único requisito es que
short int
<=int
<=long int
por tamaño. Además, hay una recomendación queint
debe representar la capacidad nativa del procesador .Todos los tipos están firmados. El
unsigned
modificador le permite utilizar el bit más alto como parte del valor (de lo contrario, está reservado para el bit de signo).Aquí hay una breve tabla de los posibles valores para los posibles tipos de datos:
En Java , la Especificación del lenguaje Java determina la representación de los tipos de datos.
El orden es:
byte
8 bits,short
16 bits,int
32 bits,long
64 bits. Todos estos tipos están firmados , no hay versiones sin firmar. Sin embargo, las manipulaciones de bits tratan los números como si no estuvieran firmados (es decir, manejando todos los bits correctamente).El tipo de datos de caracteres
char
es de 16 bits de ancho, sin signo y contiene caracteres con codificación UTF-16 (sin embargo, es posible asignar unchar
entero arbitrario de 16 bits sin signo que represente un punto de código de caracteres no válido)fuente
int
s sin firmar ...int foo = Integer.MAX_VALUE + 1; System.out.println(Integer.toUnsignedLong(foo));
imprime2147483648
y char es un tipo sin signoInteger.MAX_VALUE + 1
está0x80000000
en hexadecimal, debido al desbordamiento (y es igual aInteger.MIN_VALUE
). Si lo convierte en sin signo (largo), el bit de signo se tratará como un bit de valor, por lo que lo será2147483648
. Gracias por lachar
notachar
no está firmado, tienes razón, pero char no se usa realmente para los cálculos, por eso lo dejé de la lista.Incorrecto. El entero con signo de 32 bits en la representación del complemento a 2 tiene el rango -2 31 a 2 31 -1 que es igual a -2,147,483,648 a 2,147,483,647.
fuente
**
ni siquiera es C y, en mi opinión, no es muy clara. :)^
ya que suele serxor
Un número entero de 32 bits varía de -2,147,483,648 a 2,147,483,647. Sin embargo, el hecho de que esté en una máquina de 32 bits no significa que su
C
compilador use enteros de 32 bits.fuente
int
es del "ancho natural de la máquina" que interpretaría como 32 bits al compilar para máquinas de 32 bits.La definición del lenguaje C especifica rangos mínimos para varios tipos de datos. Para
int
, este rango mínimo es -32767 a 32767, lo que significa queint
debe tener al menos 16 bits de ancho. Una implementación es libre de proporcionar unint
tipo más amplio con un rango correspondientemente más amplio. Por ejemplo, en el servidor de desarrollo SLES 10 en el que trabajo, el rango es de -2147483647 a 2137483647.Todavía hay algunos sistemas que usan
int
tipos de 16 bits (Todo el mundo no es unVAXx86), pero hay muchos que usanint
tipos de 32 bits , y tal vez algunos que usan 64 bits.El lenguaje C fue diseñado para ejecutarse en diferentes arquitecturas. Java fue diseñado para ejecutarse en una máquina virtual que oculta esas diferencias arquitectónicas.
fuente
INT_MIN
se especifica como-32767
. No asumas el complemento de dos.El equivalente estricto de Java
int
estálong int
en C.Editar: si
int32_t
está definido, entonces es el equivalente en términos de precisión.long int
Garantizar la precisión de Javaint
, ya que se garantiza que tenga al menos 32 bits de tamaño.fuente
int32_t
si está definido por tu compiladorEsto se debe a que en C - entero en la máquina de 32 bits no significa que se usen 32 bits para almacenarlo, también puede ser de 16 bits. Depende de la máquina (depende de la implementación).
fuente
int
. Perolimits.h
ayuda a descubrir cuál es la verdad exactaEl póster tiene sus tipos de Java mezclados. en java, su C en es corta: corta (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
fuente
En realidad el tamaño en bits del
int
,short
,long
depende de la implementación del compilador.Por ejemplo, en mi Ubuntu 64 bit que tengo
short
en32
bits, cuando en otra versión de Ubuntu de 3216
bits es bit.fuente
En realidad es muy simple de entender, incluso puede calcularlo con la calculadora de Google: tiene 32 bits para un int y las computadoras son binarias, por lo tanto, puede tener 2 valores por bit (spot). si calcula 2 ^ 32 obtendrá 4.294.967.296. así que si divide este número entre 2 (porque la mitad de ellos son enteros negativos y la otra mitad son positivos), entonces obtiene 2,147,483,648. y este número es el int más grande que puede representarse por 32 bits, aunque si prestas atención notarás que 2,147,483,648 es mayor que 2,147,483,647 por 1, esto se debe a que uno de los números representa 0 que está en el medio desafortunadamente 2 ^ 32 no es un número impar, por lo tanto, no tiene solo un número en el medio, por lo que los enteros positivos tienen una cifra menos, mientras que los negativos obtienen la mitad completa 2,147,483,648.
Y eso es. Depende de la máquina, no del idioma.
fuente
int
no depende de la máquina.int
== 32 bits con signo, el complemento a dos está definido por la especificación del lenguaje Java y está grabado en hojas de unobtainium anodizado . (OK, tal vez no sea el último bit.)En el rango C para __int32 es –2147483648 a 2147483647. Vea aquí los rangos completos.
No hay garantías de que un 'int' sea de 32 bits, si desea usar variables de un tamaño específico, particularmente al escribir código que involucra manipulaciones de bits, debe usar los 'Tipos enteros estándar'.
En java
El tipo de datos int es un entero de dos con signo de 32 bits. Tiene un valor mínimo de -2,147,483,648 y un valor máximo de 2,147,483,647 (inclusive).
fuente
en el estándar C, puede usar INT_MAX como el valor 'int' máximo, esta constante debe definirse en "limits.h". Constantes similares se definen para otros tipos ( http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.5.html ), como se indicó, estas constantes dependen de la implementación pero tienen un valor mínimo de acuerdo con los bits mínimos para cada tipo, como se especifica en la norma.
fuente