char保证恰好是8位长吗?

Ori*_*ski 59 c types char

就这样.没有找到任何类似的话题所以请耐心等待.

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 8

  • signed char
    SCHAR_MIN -127 类型的对象的最小值

  • signed char
    SCHAR_MAX +127 类型的对象的最大值

  • unsigned char
    UCHAR_MAX 255 类型的对象的最大值

....

所以你有它 - char中的位数必须至少为8.

  • @jweyrich,不完全是 - 不保证括号位数.请参见http://stackoverflow.com/questions/2098149/what-platforms-have-something-other-than-8-bit-char (2认同)
  • @ChrisStratton:我认为你误解了我的肯定.一个字节的大小可能因架构而异,但无论如何,`sizeof(char)`都保证为1(字节).该1个字节由`CHAR_BIT`位组成. (2认同)
  • 您的保证声明中的括号“(8 位)”是不准确的。 (2认同)
  • "它们的实现定义值应与所示的值相等或更大"......是的,我的意思是至少8位. (2认同)

小智 12

不,它不能保证是8位.sizeof(char)保证为1,但这并不一定意味着一个8位字节.

  • 参考/解释?可能的解决方案?请 :) (4认同)

dfa*_*dfa 11

no,char数据类型必须至少包含8位(参见ANSI C规范)

  • 确切的报价,好吗? (6认同)
  • @Neil:标准确实包含<climits>(因此CHAR_BIT),并且说它的内容与C的<limits.h>相同. (3认同)

Bas*_*ard 7

C99标准草案说一个字节必须至少为8位宽,因为它<limits.h>包含一个宏CHAR_BIT,它产生每字节的位数,并保证至少为8(§5.2.4.2.1).

C++标准草案包括<limits.h>名称<climits>(第18.2.2节)下的C语言.


Nor*_*wap 5

让我们看看标准到底怎么说:

\n\n
\n

5.2.4.2.1 整数类型的大小
\n ...
\n 它们的实现定义值的大小(绝对值)应等于或大于所示的值,并具有相同的符号。

\n\n
\n\n

非位域(字节)的最小\n对象的位数
\n CHAR_BIT 8

\n
\n\n

这告诉我们一个字节至少有 8 位(上面的段落

\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

这些段落告诉我们:

\n\n
    \n
  • 一个 unsigned char 需要表示 2^CHAR_BIT-1 个值,可以在最小 CHAR_BIT 位上进行编码(根据标准规定的常规位表示)
  • \n
  • unsigned char 不包含任何附加(填充)位
  • \n
  • 有符号字符与无符号字符占用完全相同的空间
  • \n
  • char 的实现方式与有符号或无符号字符相同
  • \n
\n\n

结论: char 及其变体 unsigned char 和signed char 保证其大小恰好是一个字节,并且保证一个字节至少有 8 位宽。

\n\n

现在它们是char 确实是一个字节的其他指示(但不是上述的正式证明):

\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\n

sizeof 运算符生成其操作数的大小(以字节为单位),该操作数可以是\n 表达式或带括号的类型名称。大小由操作数的类型确定。结果是一个整数。如果操作数的类型是变长数组\n类型,则对操作数求值;否则,不计算操作数,结果为整型常量。

\n\n
\n\n

当应用于具有 char、unsigned char 或signed char 类型(或其限定版本)的操作数时,结果为 1。当应用于具有 array\n 类型的操作数时,结果是数组中的字节数。\n 88)\n 当应用于具有结构体或联合类型的操作数时,结果是此类对象中的字节总数,\n 包括内部填充和尾部填充。

\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