字符大小混淆

4
据我所知,在32位系统中,1个字符=1个字节=8位。
char c=0xffff0000;  //wrong

那么为什么char只允许8位,并且文件中的每个字符也是8位长度呢?
谢谢。

3
这是一个很好的问题标题,不过需要翻译成中文。 - Alex Brown
3
一个字节并不总是由8个比特构成的,现在只是这个值最为普遍。 - Paul R
由于标签是 c++,因此请参考此链接:您能否再次查看有关字节、字符和字符的规则? - Nan Xiao
8个回答

23
不,char的大小定义为1。但这并不意味着它总是占用32位/8位。 $3.9.1/1-“声明为字符(char)的对象应该足够大,以存储实现基本字符集的任何成员。”
似乎有一种混淆,即字节为8位。然而,C++标准并没有规定这一点。
这是标准中如何定义字节的 $1.7/1
C++内存模型中的基本存储单元是字节。一个字节至少足够大,可以包含基本执行字符集的任何成员,并由一系列连续的位组成,其数量是实现定义的。
显然,字节不总是8位。

3
你知道有没有任何一个字节不是由8位组成的系统吗?很好奇。 - Steve Townsend
@Steve Townsend:不,我的编程世界始于90年代末 :) - Chubsdad
2
我听说有些DSP具有1字节的12位(希望我没有错)。 - botismarius
@Steve:“数字电话使用8位代码也导致8位数据'八位组'被采用为早期互联网的基本数据单元。”更多信息请访问http://en.wikipedia.org/wiki/Byte#Size。 - Fred Nurk
@botismarius:是的,似乎TMS320C44和其他DSP都是这样。不幸的是,我还没有机会与DSP一起工作过 :( - Chubsdad

4
“32位”系统并不意味着它使用32位字节。
字节通常被定义为内存中可寻址的最小单元,在许多体系结构中仍然是8位,即使这些体系结构(如x86或x86-64)能够在寄存器中处理更大量的数据(分别为32位和64位)。如果你想要表达这种思想,你通常会使用“八位组”来描述8位的数量,因为“字节”的含义随着所讨论的体系结构而改变。
相比之下,对于一些人,“一个字节”被定义为始终为8位,但是这个问题的混淆可能永远不会发生,因为他们不会期望例如在32位系统上的char是32位。
当然,“n位”系统的整个概念都过于简化了。
在C语言中,你可以始终使用#include ,然后使用CHAR_BIT宏来获取编译器目标的char数据类型中的位数。

3

char有CHAR_BIT位 [来自#include <climits>]

在80x86机器上,我总是看到它是8位。
在TMS320C54x和TMS320C55x DSP上,我看到它是16位。这很麻烦,因为为了节省内存,字符串必须用每个char中保存两个ASCII字符的方式进行打包!

总是有 sizeof(char) == 1


2

一个字符始终是一个字节,大小始终为1。

一个字节至少有8位,但在某些系统上可以有更多。

32位系统指的是地址总线的大小,在C或C++中,您可以将其视为指针的大小,而不是字节的大小。


1

char类型的位数通常为8(一个字节/八位)。确切的数字在头文件<climits>中定义为CHAR_BIT


0

1字节 = 8位


1
并非必须,但现在几乎普遍如此。C++标准适用于具有6位字节的计算机(如@Chubsdad发布的引用所示)。 - Fred Foo
3
实际上不是这样。CHAR_BIT必须至少为8。 - Fred Nurk
@Fred Nurk:你说得对,我在C++中误算了所需的字符集大小。6.5位是最小的char大小,可以存储它们 :) - Fred Foo

0

一个字节绝对不是32位。无论在哪个系统中,一个字节始终是8位。

“32位”系统意味着“字”的大小为32位。换句话说,数据以32位块的形式在系统中传输。


5
不,C++标准中的字节并不总是8位。请参考我的回答。 - Chubsdad
2
@Chubsdad是正确的。ISO倾向于在8位值(至少对于通信类型标准)中使用“八位组”一词,“字节”和“字符”在C++(和C)中具有相同的(实现定义的)大小。 - paxdiablo

0
除了前面提到的观点之外,需要注意的是sizeof(char)和字符的大小并不总是相同的。
多字节字符集可能会占用每个字符超过1个字节。例如,Unicode字符始终占用多于一个字节(sizeof(wchar_t))。
有关此主题的Microsoft文档在这里。更让人困惑的是,有些字符集甚至不使用固定数量的字节来表示每个字符。

"一个Unicode字符总是占用两个字节(sizeof(wchar_t)),这表明sizeof(wchar_t)始终为2。实际上,常见的值为4,这是有道理的,因为有大约100,000个Unicode字符。" - MSalters
1
至少现在它已经符合正常编译器的标准了,但从标准的角度来看,仍有一些需要注意的地方。在 C 和 C++ 中,“多字节字符”是被定义明确的,但它们不是 wchar_t。相反,多字节字符(MBC)是一个由多个 char==byte 组成的序列。Shift-JIS 或 UTF-8 使用这样的字符。而且由于 wchar_t 与多字节字符无关,你不能推断出 sizeof(wchar_t) 总是 >1。 - MSalters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接