字符保证是正确的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 8types为signed char的对象的最小值
SCHAR_MIN -127chartypes的对象的最大值
SCHAR_MAX +127types为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标准(需要重新格式化):
- 不是位域(字节)的最小对象的位数:CHAR_BIT 8
- types为signed char的对象的最小值:SCHAR_MIN -127
- 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/相同