2012-02-19 3 views
14

Почему персонаж в Java занимает в два раза больше места для хранения в качестве символа в C?Размер символов в Java по сравнению с C

+4

Можно было бы ответить на вопрос, как можно, чтобы вы знали достаточно, что они разные, но не идут в следующий шаг и выяснить, почему? –

+10

Java в два раза эффективнее C++, и мощность должна исходить откуда-то ... –

+0

@KerrekSB Но он может иметь 256x символов. ;) –

ответ

26

В символах Java 16-бит и C они 8-бит.

Более общий вопрос: почему это так?

Чтобы узнать, почему вы должны смотреть на истории и прийти к выводам/мнения по этому вопросу.

Когда C был разработан в США, ASCII был довольно стандартным, и вам понадобятся только 7 бит, но с 8 вы можете обрабатывать некоторые не-ASCII-символы. Это может показаться более чем достаточно. Многие текстовые протоколы, такие как SMTP (электронная почта), XML и FIX, по-прежнему используют только символ ASCII. Электронная почта и XML кодируют символы не ASCII. Двоичные файлы, сокеты и поток по-прежнему являются только 8-разрядными байтами.

КСТАТИ: C может поддерживать более широкие символы, но это не обычная char

Когда Java был разработан 16-разрядные казалось, достаточно для поддержки большинства языков. С тех пор unicode был расширен до символов выше 65535, и Java пришлось добавить поддержку кодовых точек, которые являются символами UTF-16, и может быть одним или двумя 16-разрядными символами.

Итак, создавая byte байт и char, значение 16-битного значения без знака было определено в то время.

BTW: Если ваш JVM поддерживает -XX:+UseCompressedStrings, он может использовать байты вместо символов для строк, которые используют только 8-битные символы.

+0

Ну, теперь это больше нравится :) +1 –

+0

Подробнее @

+4

Чтобы быть точным, в C они * как минимум * 8-битный. –

0

Java char - это кодовая точка в кодировке Unicode, кодированная UTF-16, в то время как C использует кодировку ascii в большинстве случаев.

+4

Стандарт C не предусматривает ASCII. –

+1

Также символ Java не является «символом юникода». –

+2

Правильно, это кодовый блок UTF-16. –

2

Поскольку Java использует Unicode, C обычно использует ASCII по умолчанию.

Существуют различные варианты кодировки Unicode, но Java использует UTF-16, который использует один или два 16-разрядных блока кода за символ. ASCII всегда использует один байт на символ.

+3

UTF-16 не использует два байта на символ. –

+0

Извините, «по крайней мере» два байта на символ. – DNA

1

Java это современный язык, так он поддерживает Unicode по умолчанию, как много новых языков сегодня (например, C#). Напротив, C является «древним» языком с эпохи 7-битного ASCII, поэтому по умолчанию используется 8-битный символ.Когда вы приходите в Юникод раз, для того, чтобы не делать старые разрывы кода, они решили использовать другой тип символа, который является wchar_t

Смежные вопросы