一个字节中的位数是否等于类型char中的位数?

3

C语言标准是否规定了这一点?是否存在一个平台上字节中的位数不等于char类型中的位数?


这些也可能会引起兴趣:https://dev59.com/mnI95IYBdhLWcg3w5iY4和https://dev59.com/b2035IYBdhLWcg3wSN4G(都没有完全回答问题)。 - cdarke
2
重新开放。这个问题与“字节中的8位重复”不同:它不是关于某些东西等于8位,而是关于某些东西具有与其他东西相同数量的位。 - Bathsheba
@cdarke:明确一点,这个问题不是关于CHAR_BIT值是多少的。而是关于你是否需要使用字节中的所有位来表示char值(没有填充位)。 - jfs
是的,我明白了。你还问是否有一个平台,其中字节中的位数不等于字符,我给出的链接显示了几个讨论和这样的平台的示例。我并不认为你的问题是重复的。 - cdarke
@cdarke:我在你的链接中看到了 CHAR_BIT != 8 平台,但我没有看到位数不相等的平台(即我没有看到 char 的宽度小于 CHAR_BIT 的平台),这也意味着除非违反 C 标准,否则不存在此类平台。如果你看到了这样的平台,请将其作为回答发表。 - jfs
1个回答

4

是的。两者都等于CHAR_BIT*

C标准将CHAR_BIT定义为:"最小非位域对象(字节)的位数"。c99明确表示:"一个字节包含CHAR_BIT位。"

"UCHAR_MAX应等于2CHAR_BIT - 1" — 这意味着unsigned char至少需要CHAR_BIT位(char_bits >= CHAR_BIT)。

sizeof(char) == 1(单字节字符适合一个字节),即,类型char最多需要CHAR_BIT位(char_bits <= CHAR_BIT)。

char_bits >= CHAR_BITchar_bits <= CHAR_BIT可以推出char_bits == CHAR_BIT(没有填充位)。

POSIX明确表示"CHAR_BIT 是类型 char 中的位数。"


*: 如果char是有符号的,并且CHAR_BIT > 8,那么(没有$6.2.6.2引用下)不清楚SCHAR_MIN..SCHAR_MAX范围是否覆盖了所有CHAR_BIT位。虽然名称CHAR_BIT清晰地传达了意图(“char中的位数”)。

c11说(在n1570草案中的$6.2.6.2):signed char不能有任何填充位。必须恰好有一个符号位。”

来自$6.2.5.15

实现必须将char定义为具有与signed charunsigned char相同的范围、表示和行为

因此得出结论:所有CHAR_BIT位都用于表示CHAR_MIN..CHAR_MAX范围(因为signedunsigned char类型都使用所有位)。

相比之下,与char不同; _Bool 可能使用更少的位元 $6.7.2.1.4(122):

_Bool对象中的位数至少为CHAR_BIT,但_Bool的宽度(符号和值位的数量)可能仅为1位


1
很遗憾,由于问题已关闭,我无法添加新答案,但是在C55x的技术概述中可以找到:http://www.ti.com/lit/ug/spru393/spru393.pdf,您可以看到该系统可配置为8-48位的字节大小(一些54x系列不提供8位,但我找不到公共文档)。 “新”的c99兼容工具使CHAR_BIT == 8sizeof char == 1,因为这是标准规定的(好吧,sizeof char一直以来都是1),但大多数情况下CPU中的字节大小仍然不是8位,这确实会影响您分配的内存和编写的代码。 - Nick Bastin
@NickBastin:你现在可以添加答案了。 - jfs
1
@NickBastin:ISO C允许CHAR_BIT的任何值>=8。 POSIX要求CHAR_BIT==8。两者都要求sizeof(char)==1 - Keith Thompson

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