GCC编译器中一个字节包含多少位?

4
根据C++规范,一个字节至少能够包含基本执行字符集(2.3)中的任何成员和Unicode UTF-8编码形式的八位代码单元,并由一系列连续的比特组成,其数量由实现定义。这意味着,一个字节中的比特数必须是8位或大于8位。现在,根据gcc的规定,比特数由ABI确定。

https://gcc.gnu.org/onlinedocs/gcc-5.4.0/gcc/Characters-implementation.html#Characters-implementation

4.4 字符

一个字节中的比特数(C90 3.4,C99 和 C11 3.6)。

由ABI确定

GCC基于ABI - http://itanium-cxx-abi.github.io/cxx-abi/

有人能指出字节中比特数提到的位置吗?


2
这实际上取决于硬件(CPU)。我认为Itanium ABI没有针对任何没有8位字节的CPU。有些平台的最小可寻址单元不是8位字节(通常是DPS),但除此之外,你必须去博物馆才能找到一个没有8位字节的计算机。 - Some programmer dude
你在ABI上的URL可能是错误的。在x86-64/Linux上,请参阅https://github.com/hjl-tools/x86-psABI/wiki/x86-64-psABI-1.0.pdf,一般而言,ABI是目标平台特定的。我听说大多数计算机都有8位字节。另请参见http://utf8everywhere.org/。 - Basile Starynkevitch
@BasileStarynkevitch 这个URL并没有错。事实上,通过引用ABI,你所提供的PDF文件直接链接到同一个网站(第9.1节)。 - Lightness Races in Orbit
我的意思是ABI是特定于处理器的,而这个东西定义了char是什么。在奇怪的机器上,char可能是24位。 - Basile Starynkevitch
我同意并且根据C++规范,一个char(一个字节)可以超过8位。感谢您的答案,现在我可以串联起来并继续我的工作了。 - Ujjwal
2个回答

5
C++标准(因此大多数编译器)仅保证char至少有8个连续位。对于任何特定的编译,实际位数取决于目标CPU体系结构。但是,在大多数情况下,你会很难找到一个没有8位字节的目标CPU。
如果你必须编写依赖于8位字节假设的代码,则可以始终使用static_assert(CHAR_BIT == 8)来防止违反你的假设的任何编译。

static_assert(CHAR_BIT == 8) 这是最好的方法。谢谢! - Ujjwal

4
请问有没有人能指出字节中位数的位置?
严谨地说,它没有。该ABI在整个文档中都使用“byte”代替“octet”;在现代,“byte”通常是“octet”的常见同义词,因为大多数系统都使用8位字节。
它确实说到了这一点:
在一般情况下,该文档是作为一份通用规范编写的,可供各种体系结构上的C++实现使用。但是,它确实包含了Itanium 64位ABI的特定处理器相关材料,并将其标识为此类内容。在描述结构化数据布局时,我们通常假设Itanium psABI成员大小。
...而Itanium芯片全部采用8位字节。
如果您正在使用其他芯片,并且它的每字节位数不同,并且您找到了一个针对该芯片的编译器,则可以得到您的替代答案。(但它没有,您也没有。)
即使位和字节之间的关系没有明确说明,这里也没有真正的解释空间。
我会偶尔写一个static_assert(CHAR_BIT == 8) ,如果我感到特别神经质。总的来说,除非你的目标非常奇特,否则你可以依靠这一点。

如果您正在使用其他芯片,并且它每字节有不同数量的位,而且您找到了一个针对该芯片的编译器,那么您就有了另一种选择。 这似乎是我所从事的工作中非常有效的观点。 - Ujjwal

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