在C99中,第6.5.3.4节中始终为1:
当应用于具有类型char
、unsigned char
或signed char
(或其限定版本)的操作数时,结果为1
。
编辑:不是你的问题的一部分,但来自Harbison和Steele的C:参考手册,第三版,Prentice Hall,1991(c99之前)p.148的趣味内容:
存储单元被认为是
一个字符占用的存储量;因此,类型为char
的对象的大小为1
。
编辑:回答您更新后的问题,来自Harbison和Steele的以下问题和答案相关(ibid,第6章的Ex. 4):
是否允许在C实现中,类型char
可以表示从-2,147,483,648到2,147,483,647的值?如果是这样,那么在该实现下sizeof(char)
将是多少?int
类型的最小和最大范围是什么?
答案(ibid,第382页):
允许(虽然浪费)使用32位来表示类型char
。无论实现方式如何,sizeof(char)
的值始终为1。
虽然这并没有明确回答当字节为8位且char
为其中的4个字节的情况(实际上在c99定义中不可能,见下文),但是sizeof(char) = 1这一事实在c99标准和Harbison和Steele中都非常清楚。
编辑:实际上(这是针对您的第二个问题的回答),就c99而言,sizeof(char)
以字节为单位,同样来自于6.5.3.4节:
sizeof
运算符返回其操作数的大小(以字节为单位)
所以结合以上引用,8位字节和char
作为其中的4个字节是不可能的:对于c99,一个字节与一个char
相同。
针对您提到的7位char
的可能性:在c99中不可能。根据标准的5.2.4.2.1节,最小值为8:
他们的实现定义值应该等于或大于这些值的大小,符号相同。
- 不是位域的最小对象(字节)的位数
CHAR_BIT 8
- 类型为signed char的对象的最小值
SCHAR_MIN -127
- 类型为signed char的对象的最大值
SCHAR_MAX +127
- 类型为unsigned char的对象的最大值
UCHAR_MAX 255
- 类型为char的对象的最小值
CHAR_MIN 参见下文
- 类型为char的对象的最大值
CHAR_MAX 参见下文
如果将char类型的对象的值在表达式中作为有符号整数处理,则CHAR_MIN的值应与SCHAR_MIN的值相同,CHAR_MAX的值应与SCHAR_MAX的值相同。否则,CHAR_MIN的值应为0,CHAR_MAX的值应与UCHAR_MAX的值相同。值UCHAR_MAX应等于2^CHAR_BIT-1。
char
(而不是wchar
)的非标准编译器。即使标准规定sizeof(char)
必须为1,我也不会依赖这个假设。 - Chip Unisizeof(char)
的值始终为1,即使char在某些系统上是32位的(这种情况确实存在)。C语言有很多有趣的缺陷。 - Nick Bastinsizeof(char) == sizeof(short) && sizeof(char) == sizeof(int)
; 我不记得sizeof(int) == sizeof(long)
或者CHAR_BIT是32还是64; 我预计它是32,我认为sizeof(long) == 1
也是如此。(你可以找到一个关于Cray C手册的参考,但无法在线访问)。 - Jonathan Leffler