Почему примитив Java char занимает 2 байта памяти?

Есть ли причина, по которой примитивный тип данных Java char составляет 2 байта, в отличие от C, который составляет 1 байт?

Спасибо


person realnumber    schedule 18.10.2010    source источник
comment
Короткий ответ: потому что они оплошали: они должны были использовать 32-битные символы.   -  person tchrist    schedule 08.04.2011
comment
Нет, они не должны были использовать 32-битные символы. Это сделало бы накладные расходы еще хуже!   -  person vy32    schedule 04.07.2011
comment
@vy32: Да. Они действительно должны были использовать 6-битные символы. Это бы сэкономило место, а ведь и заглавных букв должно хватить на всех.   -  person Mechanical snail    schedule 15.07.2012
comment
5 бит на символ достаточно, если вы хотите сэкономить место. На самом деле можно использовать и оставшиеся 4 перестановки, экономя еще больше места.   -  person specializt    schedule 30.09.2014


Ответы (8)


При первоначальной разработке Java предполагалось, что любой символ Unicode будет помещаться в 2 байта (16 бит), поэтому char и Character были спроектированы соответствующим образом. Фактически, символ Юникода теперь может занимать до 4 байтов. Таким образом, UTF-16, внутренняя кодировка Java, требует, чтобы дополнительные символы использовали 2 единицы кода. Символы в базовой многоязычной плоскости (наиболее распространенные) по-прежнему используют 1. Java char используется для каждой единицы кода. Эта статья Sun хорошо объясняет это.

person Matthew Flaschen    schedule 18.10.2010
comment
Я уверен, Джоэл оценит плагин за то, что каждый программист должен знать о кодировке символов: joelonsoftware.com/articles /Unicode.html - person fooMonster; 10.11.2011

char в Java имеет кодировку UTF-16, что требует минимум 16-битной памяти для каждого символа.

person Vijay Mathew    schedule 18.10.2010

В Java символ кодируется в UTF-16, который использует 2 байта, в то время как обычный Строка C - это более или менее просто набор байтов. Когда C был разработан, использование ASCII (который охватывает только набор символов английского языка) считалось достаточным, в то время как разработчики Java уже учли интернационализацию. Если вы хотите использовать Unicode со строками C, предпочтительным способом является кодировка UTF-8. поскольку он имеет ASCII в качестве подмножества и не использует 0 байт (в отличие от UTF-16), который используется в качестве маркера конца строки в C. Такой маркер конца строки не требуется в Java как string здесь сложный тип с явно заданной длиной.

person DarkDust    schedule 18.10.2010

В предыдущих языках, таких как C, использовались нотации ASCII. И диапазон составляет 127 для 127 уникальных символов и символов языка.

Хотя JAVA поставляется с функцией под названием "ИНТЕРНАЦИОНАЛИЗАЦИЯ", в нее также добавляются все удобочитаемые символы (включая региональные символы), и диапазон также увеличивается , поэтому требуется больше памяти , система для объединения всех этих символов - "Стандартная система Unicode", и поэтому для этой унификации требуется этот дополнительный байт в ЯВА.

Первый байт остается прежним, а символы ASCII ранжируются до 127, как в C, C++, но к ним добавляются унифицированные символы.

Итак, 16 бит для char в JAVA и 8 бит для char в C.

person tilak    schedule 18.09.2015

Учебники по Java™:

Тип данных char представляет собой один 16-битный символ Unicode. Он имеет минимальное значение «\ u0000» (или 0) и максимальное значение «\ uffff» (или 65 535 включительно).

person Zeyu    schedule 11.02.2018

Java использует представление UNICODE (Universal Code), которое принимает все языковые форматы в мире.

     ASCII  American Standard Code for Information Exchange

     ISO 8859-1 for western European Countries

     KOI-8 for Russian

     GB10830 & BIG-5 for Chinese
         

В этом 1 байт зарезервирован для ASCII, а оставшийся 1 байт может принимать любой другой язык => 2 байта для char

в то время как C/C++ использует только представление ASCII => 1 байт для char

person rohit.khurmi095    schedule 21.06.2021

Java используется как интернационализация, поэтому она работает на разных языках и требует более одного байта, поэтому она занимает 2 байта в char. например, китайский язык не может обрабатывать один байт char.

person Master Amit    schedule 17.02.2015

Как мы знаем, c поддерживает ASCII, тогда как java поддерживает Unicode, который содержит 3 вещи: 1-ASCII 2-расширенный ASCII 3-символ местного языка ASCII является подмножеством unicode.ASCII поддерживает только английский язык, тогда как Unicode поддерживает многонациональный язык. символ кодируется в UTF-16, который использует 2 байта. По всей причине, и поскольку Unicode является расширенной версией ASCII, поэтому он использует 16 бит вместо 8 бит.

person Tikayat mohanta    schedule 22.02.2016