【Java】Java char 占 2 字节,为什么 \uFFFF 刚好是 16 位?揭秘字节、位与十六进制的完美对应
Q1java中char是2个字节为什么\uFFFF就刚好是16位呢这是一个非常基础但极其巧妙的数学与进制转换问题。简单来说这是因为字节、位与十六进制之间存在着完美的倍数对应关系。我们可以通过以下三个步骤来拆解1. 从字节到位在计算机中最小的单位是“位”1个字节等于8个位。Java 中char占2 个字节所以1 个char 2 × 8 16 个位。2. 从十六进制到位在 Java 中\u开头表示 Unicode 转义字符后面固定跟着 4 个十六进制数字即\uXXXX的格式。十六进制Base-16的每一个数字刚好可以用 4 个二进制位来表示因为 $ 2^4 16 $0000010001…F11113. 完美的乘法既然\u后面有4 个十六进制数字而每个数字占4 个位4 个十六进制数字 × 4 位/数字 刚好 16 位用二进制直观展示我们把\uFFFF拆开来看第1个F1111第2个F1111第3个F1111第4个F1111拼起来就是1111111111111111你数一下刚好是16 个 1这恰好填满了 2 个字节16位的所有空间。它的十进制值是 $ 2^{16} - 1 65535 $。 延伸科普为什么 Java 当时这么设计这与 Unicode 编码的历史有关早期的 UnicodeUTF-16 的前身 UCS-2在上世纪 90 年代 Java 诞生时Unicode 标准委员会认为全世界所有的字符加起来也不会超过 65536 个即 $ 2^{16} $。所以Java 的设计者就干脆把char定死为 2 个字节刚好能装下当时所有的 Unicode 字符。后来的扩展后来随着 Emoji 表情、生僻字、各种古文字的增加Unicode 字符突破了 65535 个的限制。为了兼容过去的系统Unicode 引入了“代理对”机制。现在的 Java在今天如果你在 Java 中写一个 Emoji 比如它实际上占用了2 个char即 4 个字节但在逻辑上它依然是1 个字符占用 2 个char组成的代理对。总结\uFFFF刚好是 16 位是因为2字节 16位 4个十六进制数字。这不是巧合而是 Java 最初基于 16 位 Unicode 设计时为了用最简短的十六进制形式4位完整表达一个字符2字节而自然形成的规则。