【问题标题】:Why char is of 1 byte in C language为什么char在C语言中是1个字节
【发布时间】:2015-05-11 11:08:23
【问题描述】:

为什么在 C 中 char 1 字节长?为什么不是2 字节或4 字节长?

将其保留为1 字节的基本逻辑是什么?我知道在 Java 中 char2 字节长。同样的问题。

【问题讨论】:

    标签: c char language-lawyer


    【解决方案1】:

    charC 中是 1 个字节,因为它在标准中是这样指定的。

    最可能的逻辑是。 char(在标准字符集中)的(二进制)表示可以放入 1 字节。在C 最初开发时,最常用的标准是ASCIIEBCDIC,分别需要7 位和8 位编码。因此,1 byte 足以表示整个字符集。

    OTOH,在Java 出现时,出现了扩展字符集和unicode 的概念。因此,为了面向未来并支持可扩展性,char 被赋予了2 bytes,它能够处理扩展字符集值。

    【讨论】:

    • 当然,即使他们搞砸了……一个 16 位的 char 不能代表每个 Unicode 字符。
    • @duskwuff:不仅如此,虽然其意图可能是避免以英语为中心,但在许多使用情况下,即使对于使用许多字符在 UTF-16 中可以更紧凑地表示,因为机器处理的大部分文本被设计为机器可读而不是人类可读,并且机器可读文本通常是 ASCII。
    【解决方案2】:

    为什么char 会保存超过 1 个字节? char 通常表示 ASCII 字符。只需看一下 ASCII 表,(扩展的)ASCII 码中只有 256 个字符。所以你只需要表示从 0 到 255 的数字,归结为 8bit = 1byte。

    查看 ASCII 表,例如这里:http://www.asciitable.com/

    那是 C 语言。在设计 Java 时,他们预计将来任何字符(也包括 Unicode)都可以容纳在 16 位 = 2 字节中。

    【讨论】:

      【解决方案3】:

      这是因为 C 语言已经 37 年了,1 个字符不需要更多字节,因为只使用了 128 个 ASCII 字符 (http://en.wikipedia.org/wiki/ASCII)。

      【讨论】:

        【解决方案4】:

        当 C 被开发时(第一本关于它的书由其开发者于 1972 年出版),两个主要的字符编码标准是 ASCII 和 EBCDIC,它们分别是 7 位和 8 位字符编码。内存和磁盘空间在当时都是更大的问题。 C 在具有 16 位地址空间的机器上得到普及,使用超过一个字节的字符串会被认为是浪费。

        当 Java 出现时(1990 年代中期),一些有远见的人能够意识到一种语言可以使用国际标准进行字符编码,因此选择了 Unicode 作为其定义。到那时,内存和磁盘空间就不再是问题了。

        【讨论】:

          【解决方案5】:

          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 本机字节。


          1. 基本字符集由所有26个大小写英文字母、10位数字、标点符号和其他图形字符以及换行符、制表符、换页符等控制字符组成,所有这些都可以轻松放入8个位。

          【讨论】:

          • ASCII 系统上的基本字符集可以轻松放入七位;我怀疑char 必须至少为 8,因为当 C 被发明时,八位字节开始作为一种通用标准出现,没有人使用七位存储单元,并且向后弯曲以支持一个模糊想象的七位机器可寻址存储单元似乎不值得。
          • 你是对的;基本字符集适合 7 位(因此它适合 8 位)。第 8 位最初用作错误检查的奇偶校验位(在通信线路和内存中)。然而,C 标准要求char 类型占用至少 8 位,无论它需要多少位来表示这些基本字符。
          • 我想知道是否使用 8 位而不是 7 来进行奇偶校验,或者是否使用 8 是因为它更容易获得偶数,并且奇偶校验被添加为“我们有这一点,我们不妨试着用它做点什么”?一个八位字节可以方便地存储两个以 16 为底或以 10 为底的值,或四个以 4 为底的值;一个六重奏可以方便地保存两个以 8 为基数或三个以 4 为基数的值。一个 septet 可以保存两个以 10 为底的值或以 11 为底的值,但不如八位字节方便。
          【解决方案6】:

          您不需要超过一个字节来表示整个 ascii 表(128 个字符)。

          但还有其他 C 类型有更多空间来包含数据,例如 int 类型(4 个字节)或 long double 类型(12 个字节)。

          所有这些都包含数值(甚至是字符!即使它们表示为“字母”,它们也是“数字”,您可以比较它,添加它......)。

          这些只是不同的标准尺寸,例如 cm 和 m 表示长度,.

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-08-12
            • 1970-01-01
            • 2015-05-20
            • 2011-01-16
            • 2022-01-07
            • 2020-09-30
            • 2012-08-28
            相关资源
            最近更新 更多