Ответ 1
В Java символы 16-бит, а C - 8-разрядные.
Более общий вопрос: почему это так?
Чтобы узнать, почему вам нужно посмотреть историю и прийти к выводам / мнениям по этому вопросу.
Когда C был разработан в США, ASCII был довольно стандартным, и вам понадобятся только 7 бит, но с 8 вы можете обрабатывать некоторые не-ASCII-символы. Это может показаться более чем достаточно. Многие текстовые протоколы, такие как SMTP (электронная почта), XML и FIX, по-прежнему используют только символ ASCII. Электронная почта и XML кодируют символы не ASCII. Двоичные файлы, сокеты и поток по-прежнему являются только 8-разрядными байтами.
BTW: C может поддерживать более широкие символы, но это не просто char
Когда Java была разработана, 16-разрядная версия казалась достаточной для поддержки большинства языков. С тех пор unicode был расширен до символов выше 65535, и Java пришлось добавить поддержку кодовых точек, которые являются символами UTF-16, и может быть одним или двумя 16-разрядными символами.
Таким образом, для byte
байта и char
значение unsigned 16-bit значение имеет смысл в то время.
BTW: Если ваш JVM поддерживает -XX:+UseCompressedStrings
, он может использовать байты вместо символов для строк, которые используют только 8-битные символы.