C语言标准是否规定了这一点?是否存在一个平台上字节中的位数不等于char
类型中的位数?
是的。两者都等于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_BIT
和char_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 char
或unsigned char
相同的范围、表示和行为
因此得出结论:所有CHAR_BIT
位都用于表示CHAR_MIN..CHAR_MAX
范围(因为signed
和unsigned char
类型都使用所有位)。
相比之下,与char
不同; _Bool
可能使用更少的位元 $6.7.2.1.4(122)
:
_Bool
对象中的位数至少为CHAR_BIT
,但_Bool
的宽度(符号和值位的数量)可能仅为1位。
CHAR_BIT == 8
和sizeof char == 1
,因为这是标准规定的(好吧,sizeof char
一直以来都是1),但大多数情况下CPU中的字节大小仍然不是8位,这确实会影响您分配的内存和编写的代码。 - Nick BastinCHAR_BIT
的任何值>=8。 POSIX要求CHAR_BIT==8
。两者都要求sizeof(char)==1
。 - Keith Thompson
CHAR_BIT
值是多少的。而是关于你是否需要使用字节中的所有位来表示char
值(没有填充位)。 - jfsCHAR_BIT != 8
平台,但我没有看到位数不相等的平台(即我没有看到char
的宽度小于CHAR_BIT
的平台),这也意味着除非违反 C 标准,否则不存在此类平台。如果你看到了这样的平台,请将其作为回答发表。 - jfs