Защо 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 бяха проектирани съответно. Всъщност един Unicode знак вече може да изисква до 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 система" и така че това Обединяване изисква този допълнителен байт в JAVA.

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

Така че 16 бита за char в JAVA и 8 бита за char в C.

person tilak    schedule 18.09.2015

Уроци по Java™:

Типът данни char е единичен 16-битов Unicode символ. Има минимална стойност '' (или 0) и максимална стойност '￿' (или 65 535 включително).

person Zeyu    schedule 11.02.2018

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

     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 поддържа език на мултинационалните компании.в противен случай java символът е кодиран в рамките на UTF-16, който използва 2 байта. поради цялата причина и тъй като Unicode е разширената версия на ASCII, така че използва 16 бита вместо 8 бита.

person Tikayat mohanta    schedule 22.02.2016