354 votos

¿Por qué ' t Java soporte unsigned ints.

¿Por qué no Java incluye soporte para los enteros sin signo?

A mí me parece ser una extraña omisión, dado que permiten escribir código que es menos probable que se produzcan desbordamientos en la inesperadamente grande de entrada.

Además, el uso de enteros sin signo puede ser una forma de auto-documentación, ya que indican que el valor que el unsigned int se pretende celebrar nunca se supone que debe ser negativo.

Por último, en algunos casos, los enteros sin signo puede ser más eficiente para ciertas operaciones, tales como la división.

¿Cuál es el inconveniente para incluir estas?

183voto

Uri Puntos 50687

Esto es de una entrevista con Gosling y otros, acerca de la simplicidad:

Gosling: Para mí como diseñador del lenguaje, que realmente no me considero como estos días, lo "simple" realmente terminó significado se podría esperar de J. Random Desarrollador para contener la especificación en su cabeza. La definición dice que, por ejemplo, Java no es-y de hecho, muchas de estas lenguas con una gran cantidad de casos de esquina, cosas que nadie entiende realmente. Prueba cualquier programador de C sin firmar, y muy pronto se descubre que casi no C desarrolladores de entender realmente lo que pasa con sin firmar, lo que sin signo aritmético. Cosas como la que hizo C complejo. El lenguaje de Java es, creo, bastante simple. Las bibliotecas usted tiene que mirar hacia arriba.

50voto

Neil Coffey Puntos 13408

Leyendo entre líneas, creo que la lógica era algo como esto:

  • en general, el Java diseñadores quería simplificar el repertorio de tipos de datos disponibles
  • para los fines cotidianos, que sentía que la mayoría de necesidad común fue para firma de tipos de datos
  • para la aplicación de ciertos algoritmos, unsigned la aritmética es a veces necesaria, pero el tipo de programadores que sería la implementación de estos algoritmos también tienen el conocimiento de la "obra redonda" haciendo sin firmar operaciones aritméticas con los datos firmados tipos

Sobre todo, yo diría que fue una decisión razonable. Posiblemente, habría:

  • hecho byte sin signo, o al menos han proporcionado una signed/unsigned alternativas, posiblemente con diferentes nombres, para este tipo de datos (firmado es bueno para la coherencia, pero cuando hacen alguna vez necesita un byte con signo?)
  • hecho que 'corta' (cuando fue la última vez que el uso de 16 bits con signo aritmético?)

Aún así, con un poco de kludging, operaciones sobre valores sin signo de 32 bits no son demasiado malos, y la mayoría de la gente no necesita de 64 bits sin signo de división o de comparación.

14voto

Bombe Puntos 34185

Como pronto como firmados y sin firmar ints se mezclan en una expresión las cosas comienzan a complicarse y probablemente perderá información. Restricción de Java a ints firmado sólo aclara las cosas. Me alegro de que no tengo que preocuparme sobre el negocio de todo signo aunque a veces extraño el 8.o bit en un byte. :)

12voto

akatakritos Puntos 5164

http://skeletoncoder.blogspot.com/2006/09/Java-Tutorials-Why-no-Unsigned.html

Este hombre dice porque el estándar de C define las operaciones que implican sin firmar y sin firmar ints firmado debe ser tratado como. Esto podría causar negativos enteros firmados a revolcarse en un gran unsigned int, puede provocar errores.

11voto

starblue Puntos 29696

Creo que Java está bien como está, añadiendo unsigned complicaría sin ganar mucho. Incluso con el modelo simplificado para la mayoría de los programadores de Java no sé cómo el numéricas básicas de los tipos de comportarse, acabo de leer el libro "Java Puzzlers" y sabrá a qué me refiero.

Como consejos prácticos:

Si sus valores son algo arbitrarios y tamaño no caben en int, usa. Si no caben en el uso a largo BigInteger.

El uso de los tipos más pequeños sólo para matrices cuando usted necesita para ahorrar espacio.

Si usted necesita exactamente 64/32/16/8 bits, utilice largo/int/corto/byte y dejar de preocuparse por la señal, excepto para los de la división y de comparación.

Véase también esta respuesta.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X