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

问题描述 投票:0回答:5

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

8位= log2N

N必须等于256。

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

char c = static_cast<char> (257);

cout << c;

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

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

所以,它似乎是一个8位的字符(至少在我的系统上),但我仍然看到在257及更高版本上打印到屏幕上的内容,以及在unicode表上有超过256的字符。

c++ character-encoding char size
5个回答
4
投票

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

首先,当你写:

8 bits = log2N,因此N must equal 256

你是对的。 8位可以表示最多256不同的值,并且Unicode由比此更多的字符组成的事实与该问题无关。 char并不代表那里所有可能的角色。它意味着代表一个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以对应它。


1
投票

char不一定总是8位大小。 char依赖于limits.h中定义的CHAR_BIT变量。在大多数系统上,CHAR_BIT值通常为8,但实际值取决于特定的系统和库实现。您可以在limit.h头文件here上找到更多详细信息。


1
投票

两件事情:

  • 如果您运行: char c = static_cast<char> (257); cout << static_cast<int> (c); 在最可能的情况下,你会看到1。原因确实是,char长8位,257超出范围。实际上char c不存储257但存储1。
  • 存储字符串的方式不会影响您显示字符串的方式。这取决于您的控制台字符编码。

1
投票

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.