就这些。如果没有类似的话题,请谅解。
从ANSI C规范的副本中查看,参见第3.1.2.5节-类型:
声明为char类型的对象足够大,可以存储基本执行字符集中的任何成员。如果在char对象中存储了必需源字符集中列举的成员(如$2.2.1),则其值保证为正。如果在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。
sizeof(char)
保证结果为1字节(8位)。然而,一些(相当古老的?)机器使用不同的字节大小(例如:7位)。 - jweyrichsizeof(char)
保证为1个字节(byte),那个1个字节由CHAR_BIT
位组成。 - jweyrich不,它不能保证是8位。sizeof(char)保证为1,但这并不一定意味着一个8位字节。
不行,char数据类型必须至少包含8位(请参见ANSI C规范)
C99标准草案规定一个字节至少应该是8位,因为<limits.h>
包含一个宏CHAR_BIT
,用于返回每个字节的位数,并保证至少为8(§5.2.4.2.1)。
C++标准草案将C语言的<limits.h>
命名为<climits>
(§18.2.2)。
结论:char及其变体unsigned char和signed char的大小保证恰好为一个字节,而字节保证至少为8位宽。
现在还有其他迹象(但不像上面那样是正式证明),表明char确实是一个字节:
除了位域(bit-field)外,对象都由连续的一个或多个字节序列组成,其数量、顺序和编码方式要么明确定义,要么由实现定义。从描述limits.h的C标准(需要一些重新格式化):
CHAR_BIT的最小值为8确保字符至少为8位宽。 SCHAR_MIN和SCHAR_MAX上的范围确保signed char的表示使用至少八位。
首先,如果您需要一个类型精确地占用一定数量的位数,则应使用大小特定的类型。根据您的平台,这可能从Linux上的带符号8位类型__s8
到Windows上的VC++中的__int8
。
现在,根据罗伯特·洛夫(Robert Love)在他的《Linux内核开发》中关于可移植性的章节中所述,他指出C标准“将标准类型的大小留给实现,尽管它确实规定了最小大小。”
然后,在页面底部的脚注中,他说:“除了char
始终为8位”
现在我不确定他基于什么来得出这个结论,但也许是来自ANSI C规范的这个部分?
2.2.4.2 数值限制
符合规范的实现应记录本节中指定的所有限制,这些限制应在头文件limits.h和float.h中指定
“整数类型的大小limits.h”
下面给出的值应该被替换为适用于#if预处理指令的常量表达式。它们的实现定义值应该等于或大于(绝对值)所示的值,具有相同的符号。
不是位域的最小对象的最大位数(字节)
CHAR_BIT 8
带符号char类型对象的最小值
SCHAR_MIN -127
带符号char类型对象的最大值
SCHAR_MAX +127
无符号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类型的对象在表达式中未发生符号扩展,则CHAR_MIN的值应为0,CHAR_MAX的值应与UCHAR_MAX的值相同。
<cstdint>
和其中的uint16_t
等保证宽度类型,而不是平台/编译器特定的__magicWords
。 - underscore_d