字符保证是正确的8位长?

就这样。 没有find任何类似的话题,所以忍受着我。

从ANSI C规范的副本 ,请参见第3.1.2.5节 – types

声明为chartypes的对象足够大,可以存储基本执行字符集的任何成员。 如果$ 2.2.1中枚举的所需源字符集的成员存储在char对象中,则其值保证为正值。 如果其他数量存储在char对象中,则行为是实现定义的:将值视为有符号整数或非负整数。

“执行字符集”的概念在第2.2.1节 – 字符集中介绍

换句话说,字符必须至less足够大以包含至less构成基本执行字符集的95个不同字符的编码。

现在join2.2.4.2– 数值极限

一致性实现应logging本节规定的所有限制,这些限制应在头文件<limits.h><float.h>

整体types的大小

下面给出的值应该被适用于#if预处理指令的常量expression式替代。 它们的实现定义的值应该等于或大于所示的数值(绝对值),具有相同的符号。

  • 不是位域的最小对象的最大位数(字节)
    CHAR_BIT 8

  • types为signed char的对象的最小值
    SCHAR_MIN -127

  • chartypes的对象的最大值
    SCHAR_MAX +127

  • types为unsigned char的对象的最大值
    UCHAR_MAX 255

….

所以你有它 – 一个字符中的位数必须至less为8。

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

否,char数据types必须至less包含8位(参见ANSI C规范)

C99标准草案说一个字节必须至less有8位宽,因为<limits.h>包含一个macrosCHAR_BIT ,它产生每个字节的位数,保证至less为8(§5.2.4.2。 1)。

C ++标准草案包含名为<climits> (§18.2.2)的C的<limits.h>

让我们来看看标准所说的:

5.2.4.2.1整数types的大小

其实现定义的值应与所示值相同或更大(绝对值),符号相同。


不是位域的最小对象的位数(字节)
CHAR_BIT 8

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

如果在expression式中使用chartypes的对象的值被视为有符号整数,则CHAR_MIN的值应与SCHAR_MIN的值相同,并且CHAR_MAX的值应与SCHAR_MAX的值相同。 否则,CHAR_MIN的值应为0,并且CHAR_MAX的值应与UCHAR_MAX的相同。 值UCHAR_MAX等于2 ^ CHAR_BIT – 1


对于每个有符号整数types,都有一个对应的(但是不同的)无符号整数types(用关键字unsigned来指定)使用相同的存储量(包括符号信息)并且具有相同的alignment要求。


对于除无符号字符以外的无符号整数types,对象表示的位应分为两组:值位和填充位(不需要后者中的任何一个)。

这些段落告诉我们:

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

结论:一个char和它的variablesunsigned char和signed char保证是一个字节的大小,一个字节保证至less有8位宽。

现在他们是其他迹象 (但不是上面的formscertificate),字符确实是一个字节:

除了位域之外,对象由一个或多个字节的连续序列组成,其数量,顺序和编码可以明确指定,也可以由实现定义。


存储在任何其他对象types的非位域对象中的值由n×CHAR_BIT位组成,其中n是该types对象的大小,以字节为单位。 该值可以被复制到unsigned char [n]


sizeof运算符产生其操作数的大小(以字节为单位),该操作数可以是一个expression式或一个types的括号内的名称。 大小取决于操作数的types。 结果是一个整数。如果操作数的types是一个可变长度的数组types,则对操作数进行求值; 否则,操作数不计算,结果是一个整数常量。


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

(请注意,这里有一个不明确的地方,sizeof(char)在这里覆盖sizeof(type)规则还是仅仅是一个例子?

但是,还有一个问题需要解决。 究竟是一个字节? 根据标准,它是“最小的对象不是一个位场”。 请注意,这在理论上可能不对应于一个机器字节 ,并且对于什么被称为“机器字节”也是不明确的:它可以是任何构造器称为“字节”,知道每个构造器可以有不同的“字节”的定义; 或者像“计算机在各个单元中处理的一系列位”或“最小的可寻址的数据块”这样的通用定义。

例如,具有7位字节的机器将必须实现“C字节”作为两个机器字节。

所有引用的来源: 委员会草案 – 2007年9月7日ISO / IEC 9899:TC3 。

从描述limits.h的C标准(需要重新格式化):

  1. 不是位域(字节)的最小对象的位数:CHAR_BIT 8
  2. types为signed char的对象的最小值:SCHAR_MIN -127
  3. types为signed char的对象的最大值:SCHAR_MAX +127

CHAR_BIT最小值为8确保字符至less为8位宽。 SCHAR_MIN和SCHAR_MAX上的范围确保有符号字符的表示使用至less八位。

首先我要说的是,如果你需要一个types是一个确切的位数,然后使用一个特定的大小types。 取决于您的平台,范围可以从__s8的带符号8位types的__int8到Windows上VC ++的__int8

现在,根据Robert Love在“Linux Kernel Development”中关于可移植性的章节,他指出C标准“将标准types的大小留给实现,尽pipe它规定了最小的大小”。

然后在页面底部的脚注中,他说:“除了总是8位的char之外”

现在我不确定他是以什么为基础的,但也许是ANSI C规范的这一部分?

2.2.4.2数值限制

一致性实现应logging本节规定的所有限制,这些限制应在标题limits.h和float.h中指定

“整型限制的大小”

下面给出的值应该被适用于#if预处理指令的常量expression式替代。 它们的实现定义的值应该等于或大于所示的数值(绝对值),具有相同的符号。

不是位域的最小对象的最大位数(字节)

CHAR_BIT 8

types为signed char的对象的最小值

SCHAR_MIN -127

chartypes的对象的最大值

SCHAR_MAX +127

types为unsigned char的对象的最大值

UCHAR_MAX 255

chartypes的对象的最小值

CHAR_MIN见下文

chartypes的对象的最大值

CHAR_MAX见下文

对于任何受支持的语言环境,多字节字符中的最大字节数

MB_LEN_MAX 1

short inttypes的对象的最小值

SHRT_MIN -32767

short inttypes的对象的最大值

SHRT_MAX +32767

unsigned short inttypes的对象的最大值

USHRT_MAX 65535

inttypes的对象的最小值

INT_MIN -32767

inttypes的对象的最大值

INT_MAX +32767

types为unsigned int的对象的最大值

UINT_MAX 65535

long inttypes的对象的最小值

LONG_MIN -2147483647

long inttypes的对象的最大值

LONG_MAX +2147483647

types为unsigned long int的对象的最大值

ULONG_MAX 4294967295

如果chartypes的对象的值在expression式中使用时,则CHAR_MIN的值应与SCHAR_MIN的值相同,并且CHAR_MAX的值应与SCHAR_MAX的值相同。 如果在expression式中使用chartypes的对象的值不能进行符号扩展,则CHAR_MIN的值应为0,并且CHAR_MAX的值应与UCHAR_MAX ./7/相同