2010-03-16 11 views
14

Sé que Java no permite los tipos sin signo, por lo que me preguntaba cómo se convierte un entero en un byte. Digamos que tengo un entero a con un valor de 255 y echo el entero a un byte. ¿El valor está representado en el byte 11111111? En otras palabras, ¿el valor se trata más como un entero de 8 bits con signo, o solo copia directamente los últimos 8 bits del número entero?¿Cómo se convierten los enteros en bytes en Java?

Respuesta

18

Esto se llama narrowing primitive conversion. De acuerdo con la especificación:

Una conversión estrechamiento de un entero con signo a un tipo integral T simplemente descarta todos, pero los n bits de orden bajo, donde n es el número de bits utilizados para representar Tipo T. Además de una posible pérdida de información sobre la magnitud del valor numérico, esto puede hacer que el signo del valor resultante difiera del signo del valor de entrada.

Así que es la segunda opción que enumeró (copiando directamente los últimos 8 bits).

No estoy seguro de si conoce o no cómo se representan los valores integrales, por lo que para estar seguro le indicaré que el valor de 1111 1111 es igual a -1 en el sistema two's complement (que usa Java).

+0

Sí, sabía sobre complemento de dos. Entonces, solo para aclarar, si tengo un tipo largo con un valor de -1, y lo lanzo a un int, ¿el resultado será 65535? Gracias por la respuesta rápida y detallada por cierto. – LandonSchropp

+1

@helixed: No, también será -1 porque también son todos. Cualquier cosa en el rango del tipo más pequeño se convertirá al valor equivalente. –

+0

Oh espera, ya veo. Debido al complemento de 2, cualquier valor negativo dentro del rango del tipo más pequeño se rellenará con 1 (en binario) de todos modos, por lo que el resultado siempre conservará su signo. Gracias de nuevo. – LandonSchropp

1

Solo un pensamiento sobre lo que se dice: Siempre enmascare su número entero al convertir a bytes con 0xFF (para ints). (Suponiendo que a myInt se le asignaron valores de 0 a 255).

p. Ej.

char myByte = (char)(myInt & 0xFF); 

¿por qué? si myInt es más grande que 255, solo encasillar a byte devuelve un valor negativo (complemento de 2) que no desea.

+0

char tiene dos bytes de tamaño en Java. – Paul

+3

'char' es de 16 bits en java. Si cambia su ejemplo a 'byte', tampoco funciona y aún podría generar un valor negativo. Podría enmascarar con 0x7F, pero los valores negativos no se convertirían correctamente. La buena manera de asegurarse de que no se encuentre con problemas es probablemente 'assert -128 <= myInt && myInt <= 127; ' –

+0

@Philippe, gracias. Estoy trabajando muy tarde, así que escribí esto demasiado rápido pero, sin embargo, ¿qué tan grande es 'corto' en Java? –

2

o lo hace sólo copiar directamente los últimos 8 bits del número entero

sí, esta es la forma en que esta fundición trabaja

+0

Gracias. Este es realmente el punto clave. – Hong

4
int i = 255; 

byte b = (byte)i; 

lo tanto, el valor de estar en hexadecimal es 0xFF pero el valor decimal será -1.

int i = 0xff00; 

byte b = (byte)i; 

El valor de b ahora es 0x00. Esto muestra que java toma el último byte del entero. es decir. los últimos 8 bits pero esto está firmado.

0
for (int i=0; i <= 255; i++) { 
    byte b = (byte) i; // cast int values 0 to 255 to corresponding byte values 
    int neg = b;  // neg will take on values 0..127, -128, -127, ..., -1 
    int pos = (int) (b & 0xFF); // pos will take on values 0..255 
} 

La conversión de un byte que contiene un valor más grande que 127 (es decir ,. valores de 0x80 a través de 0xFF) a un int resultados en extensión de signo del bit de orden alto del valor del byte (es decir, el bit 0x80) Para eliminar los bits 'adicionales', use x & 0xFF; esto fuerza a cero a bits mayores que 0x80 (es decir, bits 0x100, 0x200, 0x400, ...), pero deja los 8 bits inferiores como están.

También puede escribir estos; todos son equivalentes: int pos = ((int) b) & 0xFF; // convierte b en int primero, luego tira los bits altos int pos = b & 0xFF; // hecho como int arithmetic - el molde no es necesario

Java automáticamente 'promueve' tipos enteros cuyo tamaño (en # de bits) es menor que int a un valor int al hacer aritmética. Esto se hace para proporcionar un resultado más determinista (que decir C, que tiene menos restricciones en su especificación).

Es posible que desee echar un vistazo a this question on casting a 'short'.

0

Esta es mi versión de lanzar cualquier objeto posible Byte

private Byte castToByte(Object value, Byte def) 
{ 
    if (value instanceof Integer) 
    { 
     return ((Integer) value).byteValue(); 
    } 
    else if (value instanceof Number) 
    { 
     return ((Number) value).byteValue(); 
    } 
    else if (value instanceof String) 
    { 
     return Byte.valueOf((String) value); 
    } 
    return def; 
} 
0

Según mi entendimiento, que quería decir Entero

i = new Entero (2);
byte b = i; // no funcionará

final int i = 2;
byte b = i; // bien

Por último
Byte b = new Byte (2);
int a = b; // bien

0

Byte es de 8 bits. 8 bits pueden representar 256 números. (2 aumentar a 8 = 256)
Ahora el primer bit se utiliza para el signo. [si es positivo, entonces primer bit = 0, si primer bit negativo = 1]
supongamos que quiere convertir el entero 1099 en byte. simplemente dividiremos 1099 por 256. resto es su representación de bytes de int
ejemplos
1099/256 => = 75
resto -1099/256 => = -75 resto
2049/256 => resto = 1
¿por qué? mira esta imagen http://i.stack.imgur.com/FYwqr.png

Cuestiones relacionadas