char保证恰好是8位长吗?

时间:2009-05-19 10:07:48

标签: c types char

这就是全部。没有找到任何类似的话题,所以请耐心等待。

7 个答案:

答案 0 :(得分:47)

a copy of the ANSI C specification开始,请参阅第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

  •   
  • 类型对象的最小值   签名字母
    SCHAR_MIN -127

  •   
  • 类型对象的最大值   签名字母
    SCHAR_MAX +127

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

  •   
     

...

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

答案 1 :(得分:12)

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

答案 2 :(得分:11)

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

答案 3 :(得分:7)

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

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

答案 4 :(得分:3)

让我们看看标准的确切含义:

  

5.2.4.2.1整数类型的大小
  ...
  它们的实现定义值的大小应相等或更大   (绝对值)显示的那些,具有相同的符号。

     
     

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

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

  

如果char类型的对象的值   被视为有符号整数时   在表达式中使用的值   CHAR_MIN应与   SCHAR_MIN和CHAR_MAX的值   应与。的相同   SCHAR_MAX。否则,值   CHAR_MIN应为0且值为   CHAR_MAX应与   UCHAR_MAX。值UCHAR_MAX应该   等于2 ^ CHAR_BIT - 1

     
     

对于每个有符号整数类型,   有一个相应的(但是   不同的)无符号整数类型   (用关键字unsigned指定)   使用相同数量的存储空间   (包括签名信息)并且有   相同的对齐要求。

     
     

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

这些段落告诉我们:

  • 无符号字符需要表示2 ^ CHAR_BIT-1值,这些值可以在最小CHAR_BIT位上编码(根据标准规定的传统位表示)
  • unsigned char不包含任何其他(填充)位
  • 签名的char与unsigned char的空间完全相同
  • char的实现方式与signed或unsigned char
  • 相同

结论:char和它的变体unsigned char和signed char保证完全是一个字节大小,并且保证一个字节至少为8位宽。

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

  

除了比特字段,对象是   由连续的序列组成   一个或多个字节,   数字,顺序和编码是   明确指定或   实现定义的。

     
     

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

类型的对象      
     

sizeof运算符产生其操作数的大小(以字节为单位),可以是   表达式或类型的括号名称。大小由类型确定   操作数。结果是一个整数。如果操作数的类型是可变长度数组   type,操作数被评估;否则,不评估操作数,结果是   整数常数。

     
     

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

(请注意,这里存在歧义。这里sizeof(char)是否覆盖了 sizeof(type)规则还是仅举例?)

尽管如此,还有一个问题需要解决。一个字节究竟是什么?根据它的标准 “不是比特场的最小物体”。 请注意,理论上这可能与机器字节不对应,并且对于所谓的“机器字节”也存在歧义:它可以是构造函数所指的“字节”,知道每个构造函数可能有不同的“byte”定义;或一般定义,如“计算机以单个单位处理的位序列”或“最小的可寻址数据块”。

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

所有引文的来源:Committee Draft — September 7, 2007 ISO/IEC 9899:TC3

答案 5 :(得分:1)

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

  1. 最小对象的位数 那不是位字段(byte): CHAR_BIT 8
  2. 类型对象的最小值 signed char:SCHAR_MIN -127
  3. 类型对象的最大值 signed char:SCHAR_MAX +127
  4. CHAR_BIT最小值为8可确保字符至少为8位宽。 SCHAR_MIN和SCHAR_MAX上的范围确保有符号字符的表示至少使用8位。

答案 6 :(得分:-2)

我要说的第一件事是,如果你需要一个类型是精确的位数,那么使用特定于大小的类型。根据您的平台,对于Linux上签名的8位类型,__s8到Windows上VC ++中的__int8,可能会有char

现在,根据Robert Love在“Linux内核开发”中关于可移植性的章节,他指出C标准“将标准类型的大小留给了实现,尽管它确实规定了最小的大小”。

然后在页面底部的一个脚注中,他说,“{{1}}除外,总是8位”

现在我不确定他的基础是什么,但也许这部分来自the ANSI C spec

2.2.4.2数值限制

符合要求的实施应记录指定的所有限制 在本节中,应在标题limits.h中指定 和float.h

“整数类型limits.h的大小”

下面给出的值应该用常量表达式代替 适用于#if预处理指令。其 实现定义的值的大小应相等或更大 (绝对值)显示的那些,具有相同的符号。

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

CHAR_BIT 8

signed char类型对象的最小值

SCHAR_MIN -127

signed char类型对象的最大值

SCHAR_MAX +127

unsigned char类型对象的最大值

UCHAR_MAX 255

char

类型的对象的最小值

CHAR_MIN见下文

char

类型的对象的最大值

CHAR_MAX见下文

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

MB_LEN_MAX 1

short int

类型对象的最小值

SHRT_MIN -32767

short int

类型的对象的最大值

SHRT_MAX +32767

unsigned short int

类型对象的最大值

USHRT_MAX 65535

int类型对象的最小值

INT_MIN -32767

int类型对象的最大值

INT_MAX +32767

unsigned int

类型对象的最大值

UINT_MAX 65535

long int

类型的对象的最小值

LONG_MIN -2147483647

long int

类型的对象的最大值

LONG_MAX +2147483647

unsigned long int

类型对象的最大值

ULONG_MAX 4294967295

如果在一个字符串中使用char符号类型的对象的值 表达式,CHAR_MIN的值应与 SCHAR_MIN和CHAR_MAX的值应与 SCHAR_MAX。如果char类型的对象的值不是 sign-extend在表达式中使用时,CHAR_MIN的值应为 0和CHAR_MAX的值应与UCHAR_MAX的值相同 ./7 /