【发布时间】:2015-05-11 11:08:23
【问题描述】:
为什么在 C 中 char 1 字节长?为什么不是2 字节或4 字节长?
将其保留为1 字节的基本逻辑是什么?我知道在 Java 中 char 是 2 字节长。同样的问题。
【问题讨论】:
标签: c char language-lawyer
为什么在 C 中 char 1 字节长?为什么不是2 字节或4 字节长?
将其保留为1 字节的基本逻辑是什么?我知道在 Java 中 char 是 2 字节长。同样的问题。
【问题讨论】:
标签: c char language-lawyer
char 在C 中是 1 个字节,因为它在标准中是这样指定的。
最可能的逻辑是。 char(在标准字符集中)的(二进制)表示可以放入 1 字节。在C 最初开发时,最常用的标准是ASCII 和EBCDIC,分别需要7 位和8 位编码。因此,1 byte 足以表示整个字符集。
OTOH,在Java 出现时,出现了扩展字符集和unicode 的概念。因此,为了面向未来并支持可扩展性,char 被赋予了2 bytes,它能够处理扩展字符集值。
【讨论】:
char 不能代表每个 Unicode 字符。
为什么char 会保存超过 1 个字节? char 通常表示 ASCII 字符。只需看一下 ASCII 表,(扩展的)ASCII 码中只有 256 个字符。所以你只需要表示从 0 到 255 的数字,归结为 8bit = 1byte。
查看 ASCII 表,例如这里:http://www.asciitable.com/
那是 C 语言。在设计 Java 时,他们预计将来任何字符(也包括 Unicode)都可以容纳在 16 位 = 2 字节中。
【讨论】:
这是因为 C 语言已经 37 年了,1 个字符不需要更多字节,因为只使用了 128 个 ASCII 字符 (http://en.wikipedia.org/wiki/ASCII)。
【讨论】:
当 C 被开发时(第一本关于它的书由其开发者于 1972 年出版),两个主要的字符编码标准是 ASCII 和 EBCDIC,它们分别是 7 位和 8 位字符编码。内存和磁盘空间在当时都是更大的问题。 C 在具有 16 位地址空间的机器上得到普及,使用超过一个字节的字符串会被认为是浪费。
当 Java 出现时(1990 年代中期),一些有远见的人能够意识到一种语言可以使用国际标准进行字符编码,因此选择了 Unicode 作为其定义。到那时,内存和磁盘空间就不再是问题了。
【讨论】:
C 语言标准定义了一个虚拟机,其中所有对象占用整数个抽象存储单元,这些抽象存储单元由一些固定数量的位组成(由limits.h 中的CHAR_BIT 宏指定) .每个存储单元必须是唯一可寻址的。存储单元定义为基本字符集1中单个字符占用的存储量。因此,根据定义,char 类型的大小为 1。
最终,这些抽象存储单元必须映射到物理硬件上。大多数常见架构使用可单独寻址的 8 位字节,因此 char 对象通常映射到单个 8 位字节。
通常。
从历史上看,本机字节大小一直是 6 到 9 位宽。在 C 中,char 类型必须至少 8 位宽,以便表示基本字符集中的所有字符,因此要支持具有 6 位字节的机器,编译器可能具有将char 对象映射到两个本机字节,CHAR_BIT 为 12。sizeof (char) 仍为 1,因此大小为 N 的类型将映射到 2 * N 本机字节。
【讨论】:
char 必须至少为 8,因为当 C 被发明时,八位字节开始作为一种通用标准出现,没有人使用七位存储单元,并且向后弯曲以支持一个模糊想象的七位机器可寻址存储单元似乎不值得。
char 类型占用至少 8 位,无论它需要多少位来表示这些基本字符。
您不需要超过一个字节来表示整个 ascii 表(128 个字符)。
但还有其他 C 类型有更多空间来包含数据,例如 int 类型(4 个字节)或 long double 类型(12 个字节)。
所有这些都包含数值(甚至是字符!即使它们表示为“字母”,它们也是“数字”,您可以比较它,添加它......)。
这些只是不同的标准尺寸,例如 cm 和 m 表示长度,.
【讨论】: