有没有机器,其中sizeof(char)!= 1,或者至lessCHAR_BIT> 8?
是否有机器(或编译器),其中sizeof(char) != 1
?
C99标准是否说标准合规实现的sizeof(char)
必须是1? 如果是这样,请给我部分号码和引文。
更新:如果我有一台机器(CPU),它不能寻址字节(最小读取是4字节,alignment),但只有4字节( uint32_t
), 本机的编译器可以将 sizeof(char)
定义为4 ?sizeof(char)
将是1,但char将有32位 ( CHAR_BIT
macros)
更新2:但sizeof结果不是一个字节! 这是CHAR的大小。 和字符可以是2个字节,或(可能)7位?
Update3:好的。 所有机器都有sizeof(char) == 1
。 但是什么机器有CHAR_BIT > 8
?
C99第6.5.3.4节总是一个:
当应用于具有char,unsigned char或signed char的操作数(或其合格版本)时,结果为1。
编辑:不是你的问题的一部分,但从哈比森和斯蒂尔,第三版的兴趣。 (前c99)页。 148:
存储单位是一个字符占用的存储量, 因此
char
types的对象的大小是1。
编辑:在回答你最新的问题时,以下来自Harbison和Steele的问题和答案是相关的(同上,第6章第4节):
是否允许有一个C实现,其中
char
types可以表示从-2,147,483,648到2,147,483,647的值? 如果是这样,在这个实现下sizeof(char)
是什么?int
types的最小和最大范围是多less?
答复(同上,第382页):
允许(如果浪费)实现使用32位来表示
char
types。 无论实现如何,sizeof(char)
值总是1。
虽然这没有具体说明一个情况,比如字节是8位, char
是4字节(实际上不可能用c99定义,见下面), sizeof(char) = 1
总是清楚的从c99标准和Harbison和Steele。
编辑:事实上(这是为了响应你的upd 2问题),就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**
– types为signed char的对象的最小值
**SCHAR_MIN -127//−(27−1)**
– types为signed char的对象的最大值
**SCHAR_MAX +127//27−1**
– types为unsigned char的对象的最大值
**UCHAR_MAX 255//28−1**
– chartypes的对象的最小值
**CHAR_MIN** see below
– chartypes的对象的最大值
**CHAR_MAX** see below
[…]
如果在expression式中使用chartypes的对象的值被视为有符号整数,则CHAR_MIN的值应与SCHAR_MIN的值相同,并且CHAR_MAX的值应与SCHAR_MAX的值相同。 否则,CHAR_MIN的值应为0,并且CHAR_MAX的值应与UCHAR_MAX的相同。 值UCHAR_MAX等于2 ^ CHAR_BIT – 1。
sizeof(char)
是4的机器没有。它总是1个字节。 该字节可能包含32位,但就C编译器而言,它是一个字节。 有关更多详细信息,我实际上将指向您在C ++常见问题解答26.6 。 这个链接覆盖了它的相当好,我相当肯定C ++从C得到所有这些规则。你也可以看看comp.lang.c FAQ 8.10中的字符大于8位。
Upd2:但sizeof结果不是一个字节! 这是CHAR的大小。 和字符可以是2个字节,或(可能)7位?
是的,它是字节。 让我再说一遍。 根据C编译器, sizeof(char)
是1个字节。 通俗地说,一个字节(8位)与C编译器调用字节的方式不一定相同。 C字节中的位数取决于您的计算机体系结构。 它也保证至less8。
PDP-10 和PDP-11是。
更新: 有没有像PDP-10的C99编译器。
据报道 ,某些型号的ADI公司的32位SHARC DSP的CHAR_BIT = 32,TMS32F28xx的Texas Instruments DSP的CHAR_BIT = 16。
更新:有CHAR_BIT = 9的PDP-10的GCC 3.2 (在该存档中检查include / limits.h)。