c/c++中char类型固定占用1个字节(8位),存储ascii码值而非字符图形,有符号时范围−128~+127,无符号时0~255;java中char则占2字节,对应utf-16码点。

char 类型在内存中固定占用 1 个字节(8 位),无论它表示的是字母、数字还是符号。这个大小是 C/C++ 标准规定的最小存储单位,也是硬件层面最基础的寻址粒度。
char 存储的是数值,不是字符图形
内存里没有“字符”这种东西——只有 0 和 1。char 类型实际存的是该字符对应的 ASCII 码值(整数),比如:
-
'A'存的是二进制01000001(十进制 65) -
'0'存的是00110000(十进制 48),不是数值零 -
'\n'存的是00001010(十进制 10)
printf 中用 %c 打印时,系统查 ASCII 表把它“翻译”成可见字符;用 %d 打印,则直接显示那个整数。
有符号 vs 无符号:同一字节,两种解读
同样是 8 位二进制,解释方式不同,取值范围就不同:
- signed char(常见默认):最高位是符号位,范围是 −128 ~ +127
- unsigned char:全部 8 位都算数值位,范围是 0 ~ 255
例如二进制 11111111:
- 当它是
signed char→ 解释为 −1 - 当它是
unsigned char→ 解释为 255
底层存储完全一样,区别只在于编译器如何“读取”这 8 个比特。
为什么刚好是 1 字节?
这不是巧合,而是设计选择:
- ASCII 标准只需 7 位(0–127),留 1 位扩展(如 ISO-8859 或扩展 ASCII 到 255)
- 现代 CPU 的最小可寻址单元就是 1 字节,访问更小单位(如单 bit)效率低
- C/C++ 把
sizeof(char)定义为 1 —— 这是语言标准,其他类型大小都以它为基准(如sizeof(int) >= sizeof(char))
注意跨语言差异
别把 C/C++ 的 char 和 Java 的 char 混淆:
- C/C++:
char是 1 字节,对应 ASCII/扩展 ASCII - Java:
char是 2 字节(UTF-16 单元),能表示 Unicode 基本平面字符(0–65535)
同一个字符在不同语言里占的空间可能完全不同,关键看它的编码模型和运行环境。











