根据N4140
(C ++ 11工作草案):
C ++内存模型中的基本存储单元是字节。一个字节至少足以包含基本执行字符集的任何成员和Unicode UTF-8编码形式的八位代码单元,并由一个连续的位序列组成,其数量是实现定义的。 (§6.6.1-1;第48页)
我认为仅需要8位来包含“Unicode UTF-8编码形式的8位代码单元”的所有成员。是否还需要包含“基本执行字符集”的所有成员的位数?为什么CHAR_BIT
在许多实现中都可以为8?
答案 0 :(得分:9)
基本执行字符集定义如下(强调我的):
基本执行字符集和基本执行 宽字符集应各自包含基本的所有成员 源字符集,加上代表警报的控制字符, 退格和回车,加上一个空字符(分别为 null wide character),其值为0. 对于每个基本执行 字符集,成员的值应是非负的和 彼此不同。在源和执行基础上 字符集,上面列表中0之后的每个字符的值 十进制数字应大于前一个值。 执行字符集和执行宽字符集是 实现定义的基本执行字符集的超集 和基本执行宽字符集。价值 执行字符集的成员和集合 其他成员是特定于语言环境的。
基本源字符集是这样的:
基本源字符集由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标准说,需要以下类型:
强制CHAR_BIT为8,基本上也意味着至少对于小宽度类型,任何POSIX兼容平台上的表示必须是二进制补码