这就是全部。没有找到任何类似的话题,所以请耐心等待。
答案 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以外的无符号整数类型,对象的位 表示应分为两组:值位和填充位(需要 不是后者中的任何一个。)
这些段落告诉我们:
结论: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标准(需要重新格式化):
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 /