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
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).
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.
char tiene dos bytes de tamaño en Java. – Paul
'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; ' –
@Philippe, gracias. Estoy trabajando muy tarde, así que escribí esto demasiado rápido pero, sin embargo, ¿qué tan grande es 'corto' en Java? –
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
Gracias. Este es realmente el punto clave. – Hong
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.
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'.
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;
}
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
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
- 1. ¿Cómo se convierten los bytes de 8 bits a los caracteres de 6 bits?
- 2. ¿Cómo complementar los bytes en Java?
- 3. Intercambio de bytes enteros en C++
- 4. ¿Cómo funcionan los operadores! = Y == en enteros en Java?
- 5. ¿Cómo se convierten datos binarios a cadenas y viceversa en Java?
- 6. 2 bytes representan 3 enteros en C
- 7. ¿Por qué los bytes enteros se almacenan al revés? ¿Esto se aplica solo a los encabezados?
- 8. Por qué Java OutputStream.write() Toma de enteros pero escribe Bytes
- 9. Lista de enteros en cadena (matriz de bytes) - python
- 10. ¿Cómo puedo representar intervalos enteros en Java?
- 11. ¿Cómo comparar correctamente dos enteros en Java?
- 12. ¿Cómo se multiplican los números enteros en C++?
- 13. ¿Cómo se convierten números entre diferentes bases en JavaScript?
- 14. Cómo redondear * abajo * enteros en Java?
- 15. C# convierten cadena en su byte [] equivalente
- 16. ¿Por qué los enteros procesan más rápido que los bytes en NDS?
- 17. ¿Cómo se representan los caracteres de 4 bytes en C#
- 18. Frasco: ¿los encabezados no se convierten a Unicode?
- 19. Usando java para encriptar enteros
- 20. Obtener clave hash y se convierten en cadena de rubí
- 21. Combina dos números en uno. Ejemplo: 123 y 456 se convierten en 123456
- 22. no se convierten> a > en XSLT
- 23. Delphi 2010 - ¿Los archivos de origen se convierten aleatoriamente en solo lectura en el editor?
- 24. Combinar dos bytes en java/android
- 25. Cómo convertir valores enteros en una matriz de cuatro bytes en python
- 26. cadenas enteros al analizar en Java
- 27. Expresiones regulares que se convierten en un diagrama
- 28. cómo convertir imágenes en matriz de bytes en java?
- 29. ¿Cómo expreso NaN para tipos enteros en Java?
- 30. conversión de bytes a int en Java
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
@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. –
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