为什么Java中Character(char)的大小是2字节而C/C++中是1字节
C/C++ 与 Java char 类型大小差异的根本原因
两者设计目标和对字符类型的定位完全不同,直接导致了大小的区别:
C/C++ 中 char 固定为1字节
- C语言诞生于1970年代,当时主流字符编码是ASCII,仅需7位就能覆盖所有英文场景的字符需求,8位(1字节)的存储空间已经足够,还预留了1位用于校验或者扩展编码(比如后来的ISO-8859-1等单字节扩展编码)。
- C/C++ 标准明确规定
sizeof(char) == 1,这里的1字节直接对应平台的最小可寻址内存单元,也就是说char在C/C++中不仅是字符类型,更是原生字节的别名,可以直接用char指针读写任意内存块的二进制内容,是内存操作的最小单位,和平台寻址能力绑定,所以不可能设置为更大的长度。
Java 中 char 固定为2字节
- Java在1990年代设计时,就把原生支持多语言国际化作为核心特性,当时Unicode 1.0标准刚刚发布,所有定义的字符码点范围为U+0000~U+FFFF,仅需16位(2字节)就能完全覆盖,因此Java直接选择UTF-16作为
char的底层编码,将char的大小固定为2字节,用来存储单个Unicode基本多语言平面(BMP)的字符。 - Java没有原生内存操作能力,不需要让
char承担「最小内存单元别名」的功能,char的大小完全为字符存储需求服务,不需要和平台的内存寻址单元绑定,所以可以直接根据当时的Unicode编码标准设定为2字节。
补充说明:后续Unicode 2.0标准扩展了字符集,新增了码点大于U+FFFF的增补字符,此时单个
char已经无法存储这类字符,Java需要用两个char组成的代理对才能完整存储,或者用int类型存储全量Unicode码点,但这属于后续标准迭代带来的兼容问题,不影响当初的设计决策。
内容的提问来源于stack exchange,提问作者RAUSHAN KUMAR
相关产品推荐
相关产品推荐

