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

时间:2017-12-28 12:48:48

标签: c++ character-encoding char size

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

8位= log2N

N必须等于256。

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

char c = static_cast<char> (257);

cout << c;

我看到一个未知字符印在屏幕上,但仍然是一个角色。

但是,我已经运行了一些测试,我将多个字符放在一个文件中,文件的大小与char = 8比特率相对应。

所以,好像一个字符是8位(至少在我的系统上),但我仍然看到在257及以上的屏幕上打印了一些东西,以及还有更多的字符而不是256字符。 unicode表。

5 个答案:

答案 0 :(得分:4)

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

首先,当你写:

  

8 bits = log2N,因此N must equal 256

你是对的。 8位可以表示最多256个不同的值,并且Unicode由比此更多的字符组成的事实与该问题无关。 char并不代表那里所有可能的角色。它旨在表示可以解释为 some range of printable or non printable characters 256个不同值之一。

  

但是,在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来对应它。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

字符串的大小始终为8位并非强制要求。 char依赖于limits.h中定义的CHAR_BIT变量。在大多数系统上,CHAR_BIT值通常为8,但实际值取决于特定的系统和库实现。您可以在limit.h头文件here中找到更多详细信息。

答案 3 :(得分:1)

两件事:

  • 如果你跑:

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

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

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

答案 4 :(得分:0)

这实际上取决于您使用的编码算法类型。至于ascii,它只有0到255。