2010-10-31 27 views
5

Estoy mirando una aplicación en Java que se ejecuta en sistemas de 32 bits y 64 bits, y se trata principalmente de direcciones IP. Estas direcciones IP se guardan como números enteros, y el tipo normal para esto desperdicia mucha memoria en plataformas de 64 bits (y sí, el uso de la memoria ya ha demostrado ser un problema aquí). ¿Cómo declaras valores integrales de 32 bits que permanecen en 32bits incluso en arquitecturas x64?¿Cómo declaro un entero de 32 bits en Java?

Como soy un principiante en java, si hay un tipo incorporado que ya está diseñado para manejar direcciones IP favor no dude en señalar que a mí;)

+3

pensé 'int' en Java es de 32 bits tipo ?! – AraK

+0

@AraK - tal vez lo es, pero no estoy seguro de que no se amplíe a 64bits en sistemas x64 y no veo una respuesta definitiva en los documentos. –

+0

O más bien, lo veo para int, pero no hay referencia en cualquier lugar para ** unsigned ** int. –

Respuesta

27

Java tiene anchos específicos para sus datos tipos, para la portabilidad. Los enteros tienen 32 bits de ancho incluso en plataformas de 64 bits. Los estados Java language specificationquite clearly (ligeramente parafraseadas para hacer más legible, en mi opinión):

los tipos integrales son byte, short, int y long, cuyos valores son respectivamente de 8 bits, 16 bits, 32 enteros de dos bits con signo de bit y 64 bits, y char, cuyos valores son enteros sin signo de 16 bits que representan unidades de código UTF-16.

Esta es posiblemente debido a los muchos problemas de portabilidad descubiertos en C con los diferentes anchos (e incluso codificaciones como complemento a dos, complemento y signo de los/magnitud) de números enteros que Java esperaba evitar, sobre todo porque era destinado a ejecutarse en tantas plataformas diferentes como sea posible.

En cuanto a un tipo incorporado para el manejo de direcciones IP, Java tiene tanto Inet4Address como Inet6Address, según sus necesidades (y su antecesor común, InetAddress).

+1

¿qué hay de sin firmar? –

+5

@Joel Java no tiene – cobbal

+1

sin signo lo ha aceptado porque también ha apuntado a la clase InetAddress –

2

int tipo primitivo de Java tienen un tamaño fijo de 32 bits

2

Usa el primitivo int tipo. Es de 32 bits en todas las plataformas Java; ver JLS 4.2.1.

y sí, el uso de memoria ya se ha demostrado que es un problema aquí

Bueno, si usted lo dice.

No sabemos lo que está haciendo aquí. Pero si usted está preocupado por el uso de memoria en la representación de un gran número de direcciones IP en la memoria, entonces tal vez lo que necesita:

  • no guardan las direcciones IP en la memoria,
  • aumentar el tamaño de almacenamiento dinámico de Java, o
  • (si es necesario) mejora su hardware o sistema operativo.

O tal vez acaba de obtener el "desperdicio" de memoria fuera de proporción. Java tiene intrínsecamente hambre de memoria, y la respuesta pragmática es dejar que tenga lo que quiere.

SEGUIMIENTO

Java no tiene un tipo sin signo int. Pero no es necesario que represente las direcciones IP, sobre todo porque no necesita hacer cálculos aritméticos.

(Y aunque lo hiciera, hay formas de hacerlo. Tenga en cuenta que si desea exprimir la última onza de memoria "desperdicio" de una aplicación Java, tendrá que hacer algo feo cosas)

0

De http://java.sun.com/docs/books/jls/second_edition/html/typesValues.doc.html:.

Los tipos integrales son byte, short, int y long, cuyos valores son de 8 bits, de 16 bits, 32 bits y 64 bits con signo enteros dos-complemento respectivamente, respectivamente, y char, cuyos valores son de 16 bits enteros sin signo que representan caracteres Unicode.

Así int ya es de 32 bits, por definición, aunque el intérprete podría ponerlo en un límite de 64 bits en la memoria con el fin de acelerar el acceso.

0

"int"/"Entero" en Java no depende de la plataforma. Siempre es de 32 bits. El dependiente de la plataforma es com.sun.jna.ptr.IntByReference.

1

No se preocupe, el tipo int en Java se define (a diferencia de C/C++) a ser exactamente de 32 bits, como se ha mencionado here.

1

int es de 32 bit en cada plataforma. Sin embargo, para que no tenga signo, tienes que cambiar manualmente numers y esas cosas, realmente se vuelve complicado. ¿Por qué no usar un byte [] o un largo?

7

La int será de 32bits incluso en máquinas de 64 bits, no es necesario que haga nada.

De la especificación del lenguaje Java (http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html)

El tipo de datos int es una de 32 bits entero con signo de complemento a dos. Tiene un valor mínimo de -2,147,483,648 y un valor máximo de 2,147,483,647 (inclusive). Para valores integrales, este tipo de datos generalmente es la opción predeterminada. Este tipo de datos probablemente sea lo suficientemente grande para los números que usará su programa, pero si necesita un rango más amplio de valores, utilice long.

La principal diferencia entre las máquinas virtuales Java de 32 bits y de 64 bits es el tamaño máximo de almacenamiento dinámico, es decir, la cantidad de memoria que puede gestionar la máquina virtual.

Sin embargo, la implementación interna de 64 bits VM tendrá un efecto en el uso de memoria:

En general, los beneficios de ser capaz de hacer frente a mayores cantidades de memoria vienen con una pequeña pérdida de rendimiento en máquinas virtuales de 64 bits frente a ejecutar la misma aplicación en una máquina virtual de 32 bits. Esto se debe al hecho de que cada puntero nativo en el sistema ocupa 8 bytes en lugar de 4. La carga de estos datos adicionales tiene un impacto en el uso de la memoria, lo que se traduce en una ejecución levemente más lenta dependiendo de cuántos punteros se carguen durante la ejecución de tu programa Java

Desde: http://www.oracle.com/technetwork/java/hotspotfaq-138619.html#64bit_description

0

En int Java es de 32 bits. Los largos son de 64 bits. Entonces, si es mayor a 32 bits, necesita mucho tiempo.

-1

mejor manera de hacerlo es importar nuevas bibliotecas

import java.lang.Object; 
import java.lang.Number; 
import java.lang.Integer; 
You should import these libraries, this will give you a new max values. 
Cuestiones relacionadas