2011-12-01 16 views
8

Hay preguntas sobre why Java doesn't support unsigned types y algunas preguntas sobre tratar con tipos sin firmar. Hice algunas búsquedas, y parece que Scala tampoco admite tipos de datos sin signo. ¿Está la limitación en el diseño del lenguaje de Java y Scala, en el bytecode generado, o está en la propia JVM? ¿Podría haber algún lenguaje que se ejecute en la JVM y que, por lo demás, sea idéntico a Java (o Scala), pero que admita tipos de datos primitivos sin signo?¿Es la falta de tipos primitivos sin firmar de Java una característica de Java la plataforma o Java el lenguaje?

Respuesta

8

Java Bytecode Especificación sólo defines signed types:

Los tipos integrales están byte, short, int, y largo, cuyos valores son 8 bits, 16 bits, 32 bits y 64 bits con signo dos enteros complementarios

Pero un lenguaje implementado en la parte superior de la JVM probablemente puede agregar un tipo sin signo en el nivel sintáctico y solo manejar la conversión en la etapa de compilación.

+0

Nunca pensé en buscar las especificaciones de bytecode. Yo debería. Solo miré la Especificación del lenguaje Java y la documentación de Scala. –

+0

"Los operadores de enteros incorporados no indican un desbordamiento (positivo o negativo) de ninguna manera; se envuelven en el desbordamiento". Eso también indicaría que si maneja los casos correctamente, puede implementar tipos de datos sin firmar utilizando los operadores aritmáticos estándar. –

+0

Hace mucho tiempo solía trabajar con la aplicación Java de QuckTime, que es solo una envoltura alrededor de la biblioteca nativa de QuickTime que, si mi memoria no me falla, estaba llena de tipos de enteros no anclados. Fue un poco incómodo, pero la conversión firmada no firmada funcionó bien. –

2

El manejo de la aritmética sin signo es un problema de lenguaje/implementación, no de plataforma; podría simularse en cualquier plataforma incluso si no hubiera soporte nativo.

La JVM no lo tiene como tipo, por lo que Java/Scala/etc. no lo admite "fuera de la caja".

3

Aunque tipo sin signo podría ser emulado en el nivel de código de bytes, existen algunos inconvenientes con que:

  • Rendimiento: Usted necesitaría varias operaciones de código de bytes para cada operación aritmética simple. El rendimiento del código con los tipos sin signo emulados sería dos o tres veces peor que el código con tipos firmados.

  • Compatibilidad: la mayoría de los lenguajes que se ejecutan en una JVM intentan mucho para ser compatibles con la gran cantidad de código de Java que existe. Esto, por supuesto, se estropearía inmediatamente cuando se introducen tipos adicionales o cuando algunas variables con tipos "conocidos" tienen que manejarse de manera diferente.

A la luz de esto los beneficios para los tipos sin signo son mi humilde opinión insignificante.

+0

Las adiciones y sustracciones de números del mismo tamaño no se verán afectadas. Las comparaciones probablemente serían la mayor molestia. – supercat

+0

@supercat: ¿por qué crees eso? –

+1

Las únicas operaciones en las que puedo pensar que se verían afectadas serían la división, las comparaciones y las conversiones a tipos "largos" o de coma flotante. De ellos, las comparaciones se usarían con más frecuencia que las demás, y normalmente tomarían la menor cantidad de tiempo. – supercat

Cuestiones relacionadas