2010-08-02 24 views
5

Quiero entender cómo convertir el número con signo en sin firmar.Comprensión de los números sin firmar de Java

Digamos que tengo esto:

byte number = 127; // '1111111' 

Con el fin de que sea sin firmar tengo que elegir "más grande" tipo de datos 'corto' y aplicar el operador AND con el valor 0x00ff.

short number2; 
number2 = number & 0x00ff; 

¿Por qué el número no está firmado?

Respuesta

4

Java en realidad no tiene primitivas sin signo.

El valor 127 está representado en realidad por '01111111', siendo el primer bit el signo (0 es positivo).

Un byte sin signo podría contener valores de 0 a 255, pero 127 es el máximo para un byte con signo. Como un byte tiene 8 bits, y el firmado consume uno para mantener el signo. Entonces, si quiere representar valores mayores a 127, necesita usar un tipo más grande que tenga una mayor cantidad de bits. El tipo mayor también tiene un bit reservado para el signo, pero tiene al menos 8 bits para los valores reales, por lo que puede representar el valor 255.

Habiendo dicho esto, probablemente debería evitar el uso de bytes y abreviaturas porque existen son problemas con ellos. Notarás que lanzo el resultado a corto, ya que los operadores realmente devuelven int. Deberías mantenerte en int y long in java ya que se implementan mejor.

Editar: el operador AND lo hace sin signo ya que el bit de signo es el primer bit del short, y copia los 8 bits que contienen el valor del byte a los últimos 8 bits del short. Entonces, si tienes un número negativo, el primer bit que es 1 (eso significa que es negativo) en realidad se convierte en parte del valor. Y el corto siempre será positivo ya que su bit de signo está a dos niveles de una potencia de dos para verse afectado por el corto.

byte:    10101101 
        ||||||| <- actual value 
short:  0000000010101101 
      ||||||||||||||| <- actual value 

Edición 2: Tome en cuenta sin embargo que, dado que los valores negativos utilizan two's complement representation el valor no puede ser lo que esperas. todos los valores positivos siguen siendo los mismos.
Pero -128 = 0x10000000 se convertirá en 128
-127 = 0x10000001 se convertirá en 129
y así sucesivamente hasta -1 = 0x11111111, que se convertirán en 255

+0

¿Algún enlace para los problemas sobre byte y short? He usado byte de vez en cuando, pero nunca he usado short. –

+0

@DeanJ: Creo que el problema es el rendimiento, ya que necesita más lanzamientos porque muchas operaciones devuelven int. – Cloudanger

+0

El primer ejemplo aquí demuestra el punto: http: //blog.mpathirage.com/2010/06/27/java-puzzlers-phantom-reference-threat-attack-of-the-clone-revenge-of-the-shift/Si utiliza cualquier operador en el corto como + o - en realidad se transforma en un int y que puede causar problemas al llamar a métodos sobrecargados. –

1

java no tiene tipos de datos sin signo. Simplemente cambia al tipo de datos "más grande", eso es todo.

+0

pregunté cómo esta operación Y lo hace sin firmar – shlomjmi

+0

no lo hace hacerlo sin tipo. Lo máximo que puedes lograr con la magia de cambio de bit es tirar menos. Pero eso no lo convierte en un tipo sin firma. De todos modos, ¿cómo crees que sucede eso? ¿Bitshifting accidentalmente crea una nueva subclase o hacks en JVM? – foret

0

Si acaba de pasar de un byte negativo a int el int también será negativo. Sou toma el negativo int (o el corto en su ejemplo) y establece el byte 3 (int) más alto en 0x00.

Cuestiones relacionadas