¿Hay alguna razón por la que el tipo de datos primitivo de Java Char sea de 2 bytes a diferencia de C, que es de 1 byte?¿Por qué la primitiva de carga Java ocupa 2 bytes de memoria?
Gracias
¿Hay alguna razón por la que el tipo de datos primitivo de Java Char sea de 2 bytes a diferencia de C, que es de 1 byte?¿Por qué la primitiva de carga Java ocupa 2 bytes de memoria?
Gracias
char
en Java es UTF-16 codificado, que requiere un mínimo de 16-bits de almacenamiento para cada carácter.
Cuando Java fue diseñado originalmente, se anticipó que cualquier carácter Unicode encajaría en 2 bytes (16 bits), por lo que char
y Character
fueron diseñados en consecuencia. De hecho, un carácter Unicode ahora puede requerir hasta 4 bytes. Por lo tanto, UTF-16, la codificación interna de Java, requiere que los caracteres suplementarios usen 2 unidades de código. Los caracteres en el plano multilingüe básico (los más comunes) todavía usan 1. Se usa Java char
para cada unidad de código. Esto Sun article lo explica bien.
Estoy seguro de que Joel apreciará el complemento para "lo que cada programador debe saber sobre la codificación de caracteres: http://joelonsoftware.com/articles/Unicode.html – fooMonster
En Java, un carácter está codificado en UTF-16 que utiliza 2 bytes, mientras que una cadena C normal es más o menos un grupo de bytes. Cuando se diseñó C, usar ASCII (que solo cubre el conjunto de caracteres en inglés) fue considerado suficiente, mientras que los diseñadores de Java ya explicaron la internacionalización. Si desea utilizar Unicode con cadenas C, la codificación UTF-8 es la preferida, ya que tiene ASCII como subconjunto y no utiliza el byte 0 (a diferencia de UTF-16), que se utiliza como marcador de fin de cadena en C. Tal marcador de fin de cadena no es necesario en Java ya que una cadena es un tipo complejo aquí, con una longitud explícita.
Java se utiliza como internacionalización, por lo tanto, su trabajo en diferentes idiomas y la necesidad de espaciar más de un byte, es por eso que toma 2 bytes de espacio en char. por ejemplo, el idioma chino no puede pasar un byte de char.
En idiomas anteriores como C se usan anotaciones ASCII. Y el rango es 127, para 127 símbolos únicos y caracteres de idioma.
Mientras JAVA viene con una característica llamada "internacionalización", es decir todos los legible caracteres (incluyendo símbolos regionales) también se añaden en él, y la gama también se incrementa, por lo que más de la memoria requerido, el sistema para unificar todos estos símbolos es "Sistema Unicode estándar", y para que este Unificación requiera ese byte adicional en JAVA.
El primer byte permanece como está y los caracteres ASCII se alinean a 127 como en C, C++ pero se añaden caracteres unificados.
Así 16-bits para Char en JAVA y 8-bits para Char en C.
Como sabemos suppors c ASCII donde como Java soporta Unicode que contiene 3 cosas que es 1-ASCII 2 extendió- ASCII 3-local language character ASCII es un subconjunto de unicode.ASCII solo admite el idioma inglés, ya que Unicode admite el lenguaje multinacional. De lo contrario, el carácter java se codifica dentro de UTF-16 que usa 2 bytes. Por todo el motivo y como Unicode es la versión extendida de ASCII, por lo que usa 16 bit insted de 8 bit.
Tutoriales de Java ™: El tipo de datos char es un único carácter Unicode de 16 bits. Tiene un valor mínimo de '\ u0000' (o 0) y un valor máximo de '\ uffff' (o 65,535 inclusive).
La respuesta corta es porque se equivocaron: deberían haber usado caracteres de 32 bits. – tchrist
No, no deberían haber usado caracteres de 32 bits de ancho. ¡Eso empeoraría los gastos generales! – vy32
@ vy32: Sí. Realmente deberían haber usado [caracteres de 6 bits de ancho] (https://en.wikipedia.org/wiki/Six-bit_character_code). Eso ahorraría espacio, y después de todo, las letras mayúsculas deberían ser suficientes para todos. –