为什么CHAR_BIT通常为8?

时间:2018-04-11 04:58:08

标签: c++

根据N4140(C ++ 11工作草案):

  

C ++内存模型中的基本存储单元是字节。一个字节至少足以包含基本执行字符集的任何成员和Unicode UTF-8编码形式的八位代码单元,并由一个连续的位序列组成,其数量是实现定义的。 (§6.6.1-1;第48页)

我认为仅需要8位来包含“Unicode UTF-8编码形式的8位代码单元”的所有成员。是否还需要包含“基本执行字符集”的所有成员的位数?为什么CHAR_BIT在许多实现中都可以为8?

3 个答案:

答案 0 :(得分:9)

基本执行字符集定义如下(强调我的):

  

[lex.charset]/3

     

基本执行字符集基本执行   宽字符集应各自包含基本的所有成员   源字符集,加上代表警报的控制字符,   退格和回车,加上一个空字符(分别为   null wide character),其值为0. 对于每个基本执行   字符集,成员的值应是非负的和   彼此不同。在源和执行基础上   字符集,上面列表中0之后的每个字符的值   十进制数字应大于前一个值。   执行字符集执行宽字符集是   实现定义的基本执行字符集的超集   和基本执行宽字符集。价值   执行字符集的成员和集合   其他成员是特定于语言环境的。

基本源字符集是这样的:

  

[lex.charset]/1

     

基本源字符集由96个字符组成:空格   字符,表示水平制表符的控制字符,   垂直制表符,换页符和换行符,以及以下91个图形   字符:

      
a b c d e f g h i j k l m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
0 1 2 3 4 5 6 7 8 9
_ { } [ ] # ( ) < > % : ; . ? * + - / ^ & | ~ ! = , \ " '

请注意标准定义的 basic 执行字符集与实现定义的执行字符集之间的区别。前者仅包含大约100个字符,并且那些(无论哪个)的编码可以很好地适合8位。

在阅读问题中的段落时,还必须谨慎行事。一个字节需要足够大,以便在基本执行字符集中保存字符的编码为utf-8字符。前一种编码可能是(通常)后者的一个子集,但即使它不一定,8位也是最小的。

答案 1 :(得分:4)

基本执行集包含96个字符,而不是其中一个字符在ASCII字符集之外。 UTF-8的前127个字符 ASCII。

所以不,基于基本的执行集字符,char不需要大于8位。

答案 2 :(得分:0)

C具有char类型的定义,语言规范基本上可互换地使用术语char和byte。从历史上看,有时候有一些字符有字符(因此是字节),宽度不同于8,特别是一些早期的计算机编码只有6位的可打印字符,字数大小为36.后来其他构造函数发现它更多方便将16位的字作为最不可寻址的单位。

因此,在C90中定义了:

  

char中的位数在宏CHAR_BIT中定义.CHAR_BIT可以是任何值,但必须至少为8

即使在C99中也声明:

  

一个字节包含CHAR_BIT位,unsigned char类型的值范围为0到(2 ^ CHAR_BIT) - 1。

但是,在包含文件stdint.h的页面上,它指出:

  

typedef name int N _t指定带宽的带符号整数类型   N,没有填充位,以及二进制补码表示。从而,   int8_t表示有符号整数类型,宽度恰好为8位。

到目前为止一切顺利,如果有一个int8_t我们可以推断出sizeof(int8_t)必须为1且CHAR_BIT必须为8。 但是POSIX标准说,需要以下类型:

  • 中int8_t
  • int16_t
  • int32_t
  • uint8_t
  • uint16_t
  • uint32_t的

强制CHAR_BIT为8,基本上也意味着至少对于小宽度类型,任何POSIX兼容平台上的表示必须是二进制补码

Source