有没有机器,其中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_BITmacros)

更新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:

存储单位是一个字符占用的存储量, 因此chartypes的对象的大小是1。

编辑:在回答你最新的问题时,以下来自Harbison和Steele的问题和答案是相关的(同上,第6章第4节):

是否允许有一个C实现,其中chartypes可以表示从-2,147,483,648到2,147,483,647的值? 如果是这样,在这个实现下sizeof(char)是什么? inttypes的最小和最大范围是多less?

答复(同上,第382页):

允许(如果浪费)实现使用32位来表示chartypes。 无论实现如何, 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)。