Pau*_*xon 47
从ANSI C规范的副本,请参见第3.1.2.5节 - 类型:
声明为char类型的对象足够大,可以存储基本执行字符集的任何成员.如果$ 2.2.1中枚举的所需源字符集的成员存储在char对象中,则其值保证为正.如果其他数量存储在char对象中,则行为是实现定义的:值被视为有符号或非负整数.
第2.2.1节 - 字符集中介绍了"执行字符集"的概念.
换句话说,char必须至少足够大以包含构成基本执行字符集的至少95个不同字符的编码.
现在添加2.2.4.2节- 数值限制
符合要求的实施应记录本节规定的所有限制,应在标题
<limits.h>和 规定中规定<float.h>.整数类型的大小
下面给出的值应替换为适用于#if预处理指令的常量表达式.它们的实现定义值的大小(绝对值)应等于或大于显示的值,并带有相同的符号.
最小对象的最大位数,不是位字段(字节)
CHAR_BIT 8signed char
SCHAR_MIN -127 类型的对象的最小值signed char
SCHAR_MAX +127 类型的对象的最大值unsigned char
UCHAR_MAX 255 类型的对象的最大值....
所以你有它 - char中的位数必须至少为8.
dfa*_*dfa 11
no,char数据类型必须至少包含8位(参见ANSI C规范)
C99标准草案说一个字节必须至少为8位宽,因为它<limits.h>包含一个宏CHAR_BIT,它产生每字节的位数,并保证至少为8(§5.2.4.2.1).
C++标准草案包括<limits.h>名称<climits>(第18.2.2节)下的C语言.
让我们看看标准到底怎么说:
\n\n\n\n\n5.2.4.2.1 整数类型的大小
\n\n
\n ...
\n 它们的实现定义值的大小(绝对值)应等于或大于所示的值,并具有相同的符号。
\n\n非位域(字节)的最小\n对象的位数
\n
\n CHAR_BIT 8
这告诉我们一个字节至少有 8 位(上面的段落
\n\n\n\n\n如果在表达式中使用时,将 char 类型的对象的值视为有符号整数,则 CHAR_MIN 的值应与 SCHAR_MIN 的值相同,并且 CHAR_MAX 的值应为与 SCHAR_MAX 相同。否则,CHAR_MIN 的值应为 0,CHAR_MAX 的值应与 UCHAR_MAX 的值相同。UCHAR_MAX 值应等于 2^CHAR_BIT - 1
\n\n
\n\n对于每个有符号整数类型,都有一个对应的(但不同的)无符号整数类型(用关键字 unsigned 指定),它使用相同的存储量(包括符号信息)并具有\n 相同的对齐要求。
\n\n
\n\n对于除 unsigned char 之外的无符号整数类型,对象表示的位应分为两组:值位和填充位(不需要后者)。
\n
这些段落告诉我们:
\n\n结论: char 及其变体 unsigned char 和signed char 保证其大小恰好是一个字节,并且保证一个字节至少有 8 位宽。
\n\n现在它们是char 确实是一个字节的其他指示(但不是上述的正式证明):
\n\n\n\n\n除位\xef\xac\x81字段外,对象由一个或多个字节的连续序列组成,其数量、顺序和编码是显式指定的或实现定义的。
\n\n
\n\n存储在任何其他对象类型的非位\xef\xac\x81eld 对象中的值由 n \xc3\x97 CHAR_BIT\n 位组成,其中 n 是该类型的对象的大小(以字节为单位)。该值可以复制到\n unsigned char [n] 类型的对象中
\n\n
\n\nsizeof 运算符生成其操作数的大小(以字节为单位),该操作数可以是\n 表达式或带括号的类型名称。大小由操作数的类型确定。结果是一个整数。如果操作数的类型是变长数组\n类型,则对操作数求值;否则,不计算操作数,结果为整型常量。
\n\n
\n\n当应用于具有 char、unsigned char 或signed char 类型(或其限定版本)的操作数时,结果为 1。当应用于具有 array\n 类型的操作数时,结果是数组中的字节数。\n 88)\n 当应用于具有结构体或联合类型的操作数时,结果是此类对象中的字节总数,\n 包括内部填充和尾部填充。
\n
(请注意,这里有一个歧义。这里的 sizeof(char) 是否覆盖了 sizeof(type) 规则,还是仅仅给出了一个示例?)
\n\n尽管如此,还有一个问题需要解决。字节到底是什么?根据标准,它是“不是位域的最小对象”。请注意,理论上这可能不对应于机器字节,并且对于什么是“机器字节”也存在歧义:它可以是构造函数称为“字节”的任何内容,因为知道每个构造函数可能有不同的“字节”的定义;或一般定义,如“计算机在各个单元中处理的位序列”或“最小的可寻址数据块”。
\n\n例如,具有 7 位字节的机器必须将“C 字节”实现为两个机器字节。
\n\n所有引用来源:委员会草案 \xe2\x80\x94 2007 年 9 月 7 日 ISO/IEC 9899:TC3。
\n