代码之家  ›  专栏  ›  技术社区  ›  Inertial Ignorance

为什么字符的大小只有8位?

  •  0
  • Inertial Ignorance  · 技术社区  · 7 年前

    在大多数标准系统中,字符的大小为8位。使用香农方程:

    8位=log2N

    N必须等于256。

    然而,在Unicode表上,有远远超过256个字符。在我的编译器上,当我运行以下代码行时:

    char c = static_cast<char> (257);
    
    cout << c;
    

    我看到屏幕上打印着一个未知字符,但仍然是一个字符。

    然而,我已经运行了一些测试,在这些测试中,我在一个文件中放置了许多字符,并且文件的大小与char=8位的比率相对应。

    所以,看起来一个字符是8位的(至少在我的系统上是这样),但我仍然看到屏幕上打印的字符是257或更高,而且unicode表上的字符比256多得多。

    5 回复  |  直到 7 年前
        1
  •  4
  •   Fureeish    7 年前

    char 由保证为1字节 C++ 标准请记住,它并不表示大小为8位,因为不是在每个系统上 byte = 8 bits 是真的。为了便于解释,假设我们只讨论了8位字节。

    首先,当你写作时:

    8 bits = log2N 因此 N must equal 256

    你是对的。8位最多可表示 256 不同的值,以及Unicode包含的字符比这多这一事实与问题无关。 烧焦 并不是要代表所有可能的角色。它是为了代表 256 可以解释为的不同值 some range of printable or non printable characters .

    然而,在Unicode表上,有远远超过256个字符。在我的编译器上,当我运行以下代码行时:

    char c = static_cast<char> (257);
    cout << c;
    

    我看到屏幕上打印着一个未知字符,但仍然是一个字符。

    但你有没有试过真正确定 static_cast<char>(257) 回来

    char c = static_cast<char>(257);
    std::cout << static_cast<int>(c);
    

    将打印 1 ,当我们深入到Unicode(或ASCII)表时,我们可以看到该值表示 Start of Heading 性格它是不可打印的字符,打印它将导致控制台上出现未定义的字符( 需要确认这是否真的未定义 ).

    要打印范围更广的字符,请考虑使用 wchar_t (最有可能是 16 位,因此它可以覆盖65536个值的范围)和 std::wstring 与之相对应。

        2
  •  1
  •   codingenthusiast    7 年前

    字符的大小不一定总是8位。char取决于限制中定义的char\u位变量。h、 CHAR\u位值在大多数系统上通常为8,但实际值取决于特定的系统和库实现。您可以找到有关限制的更多详细信息。h头文件 here .

        3
  •  1
  •   saracen    7 年前

    有两件事:

    • 如果您运行:

      char c = static_cast<char> (257);
      cout << static_cast<int> (c);
      

      在最可能的情况下,您将看到 1 . 原因确实是,char的长度为8位,257超出了范围。事实上 char c 不存储257,但存储1。

    • 存储字符串的方式不会影响字符串的显示方式。这取决于您的控制台字符编码。

        4
  •  1
  •   Pete Becker    7 年前

    由于历史原因,字符为8位。当开发C编程时,大多数输出都在哑终端上。哑终端根据ASCII字符编码显示字符。ASCII字符范围在0-255之间。这处理了大多数可打印的英文字符。 考虑到所有语言,有256个以上的字符。开发了额外的字符编码。Unicode是一种,UTF-8是另一种。

        5
  •  0
  •   haichuan    7 年前

    这实际上取决于您使用的是哪种编码算法。至于ascii码,它只在0到255之间。