在大多数标准系统中,char的大小为8位。使用香农方程:
8位= log2N
N必须等于256。
但是,在Unicode表上有超过256个字符。在我的编译器上,当我运行以下代码行时:
char c = static_cast<char> (257);
cout << c;
我看到一个未知字符印在屏幕上,但仍然是一个角色。
但是,我已经运行了一些测试,我将多个字符放在一个文件中,文件的大小与char = 8比特率相对应。
所以,好像一个字符是8位(至少在我的系统上),但我仍然看到在257及以上的屏幕上打印了一些东西,以及还有更多的字符而不是256字符。 unicode表。
答案 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。