是否有机器,其中sizeof(char)!= 1,或者至少CHAR_BIT> 8?


93

是否有机器(或编译器)在哪里sizeof(char) != 1

C99标准是否说sizeof(char)在标准合规性实施上必须完全为1?如果有,请给我编号和引用。

更新: 如果我有一台不能寻址字节的机器(CPU)(最小读取为4字节,对齐),但是只有4-s字节(uint32_t),则该机器的编译器可以定义sizeof(char)为4吗? sizeof(char)将为1,但char将具有32位CHAR_BIT宏)

Update2: 但是sizeof结果不是BYTES!它是CHAR的大小。char可以是2个字节,或者(可能是)7位?

更新3: 好的。所有机器都有sizeof(char) == 1。但是什么机器CHAR_BIT > 8呢?


4
我担心符合C99标准。我与C99编译器紧密合作
osgx 2010年

2
随着Unicode变得越来越重要,可能会有非标准的编译器使用Unicode字符作为char(而不是wchar)。即使标准说sizeof(char)必须为1,我也不会依赖于这一假设。
Chip Uni

14
没有C编译器的sizeof(char)不为1,是否为unicode。

6
@Chip:sizeof(char)始终为1,即使char是32位(在某些系统上也是如此)。C有很多有趣的疣。
尼克·巴斯汀 Nick Bastin)2010年

2
所有C标准版本都要求CHAR_BIT至少为8;您不能使用CHAR_BIT == 7并符合标准。但是,对于机器来说,使CHAR_BIT> 8是完全可行的,我相信(sizeof(char) == sizeof(short) && sizeof(char) == sizeof(int)在这些机器上,旧的Cray机器确实做到了;我不记得sizeof(int) == sizeof(long)CHAR_BIT是32还是64;我希望它是32,我也认为sizeof(long) == 1。 (您可以找到Cray C手册的参考,但不能在线访问。)
Jonathan Leffler

Answers:


91

它始终是C99中第6.5.3.4节的内容:

当将其应用于具有char,unsigned char或signed char类型(或其限定版本)的操作数时,结果为1。

编辑:不是您的问题的一部分,但要引起Harbison和Steele的兴趣,第三版。(c99之前)p。148:

存储单位为一个字符占用的存储空间;类型对象的大小char因此 1。

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

是否可以使用C实现,其中的类型char可以表示-2,147,483,648到2,147,483,647之间的值?如果是这样,sizeof(char) 该实施将是什么?类型的最小和最大范围是int多少?

答案(同上,第382页):

一个实现被允许(如果浪费的话)使用32位来表示type char。不论执行何种方式,的值 sizeof(char)始终为1。

虽然这并没有专门解决字节为8位且char为其中4个字节的情况(对于c99定义实际上是不可能的,请参见下文),sizeof(char) = 1但从c99标准以及Harbison和Steele总是很清楚这一事实。

编辑:实际上(这是对upd 2问题的答复),就c99而言sizeof(char) 以字节单位,再次来自6.5.3.4节:

sizeof运算符产生其操作数的大小(以字节为单位)

因此,结合以上引用,char不可能使用8位字节以及这些字节中的4个字节:对于c99,字节与a相同char

回答您提到7位的可能性char:在c99中这是不可能的。根据标准的5.2.4.2.1节,最小值为8:

其实现定义的值的大小应等于或大于所显示的值,并带有相同的符号。

—不是位字段的最小对象的位数(字节)

 **CHAR_BIT 8**

—符号类型为char的对象的最小值

**SCHAR_MIN -127//−(27−1)** 

—签名字符类型的对象的最大值

**SCHAR_MAX +127//27−1** 

—无符号字符类型的对象的最大值

**UCHAR_MAX 255//28−1** 

— char类型的对象的最小值

**CHAR_MIN**    see below 

— char类型的对象的最大值

**CHAR_MAX**    see below

[...]

如果在表达式中使用char类型的对象的值时,将其视为有符号整数,则CHAR_MIN的值应与SCHAR_MIN的值相同,并且CHAR_MAX的值应与SCHAR_MAX的值相同。否则,CHAR_MIN的值应为0,而CHAR_MAX的值应与UCHAR_MAX的值相同。UCHAR_MAX的值应等于2 ^ CHAR_BIT − 1。


9
附加说明。有一个CHAR_BITS宏,它将告诉您字符的位数。

1
这本好书的全部数据是Harbison和Steele的。C:参考手册,第三版,Prentice Hall,1991年
osgx 2010年

2
如果您知道您正在使用char类型,并且您知道该语言要求它们的大小为1,为什么总是放置多余的sizeof(char)是一个好主意?

1
(a)和(c)有更严重的后果,是无法解决甚至无法解决的;还有YAGNI。(b)中的人只需要被告知一次-我不需要在我的代码的每一行中都教他们。但是,使用sizeof(char)它有缺点:这是另一个要辩论/检查/检查的项目。在您的编码约定/标准/指南中,浪费了我的时间,想知道您是否真的知道C,还有什么不正确的地方,占用了视觉/心理/文本行“带宽”。

1
@Ramashalanka:是的,编译后的代码是等效的。这是所有与可读性有关的问题,否则就是人们如何使用我在说的源代码。(而且FWIW,我认为您在这里有一个不错的+1答案,我只是发现“总是使用sizeof(char)”被误解了,这对我来说是个热键问题,即使是很小的问题。)

21

没有机器sizeof(char)是4。它总是1字节。该字节可能包含32位,但是就C编译器而言,它是一个字节。有关更多详细信息,我实际上将指向C ++ FAQ 26.6。该链接覆盖得很好,我可以肯定C ++从C获得了所有这些规则。对于大于8位的字符,您还可以查看comp.lang.c FAQ 8.10

Upd2:但是sizeof结果不是BYTES!它是CHAR的大小。char可以是2个字节,或者(可能是)7位?

是的,它是字节。我再说一遍。 sizeof(char)根据C编译器为1字节。人们俗称的字节(8位)不一定与C编译器称为字节的相同。C字节中的位数取决于您的计算机体系结构。也保证至少为8。


3
请!!!C ++是与C(C99)真正不同的语言。这个问题仅与普通C有关。
osgx

<strike>当机器/ CPU无法访问8位字节时该怎么办?禁止未对齐的访问。 >
osgx

10
@osgx,当人们尝试混合使用C和C ++时,我往往会像您一样大声尖叫。但我认为,在这种情况下是一个C ++ FAQ中也同样适用于C.
迈克尔Kristofik

3
“ 8位”的正确名称是八位位组。C标准将“字节”一词用于表示一个字符大小的对象。其他人可能以不同的方式使用“字节”一词,通常当它们表示“八位字节”时,但是在C(以及C ++或Objective-C)中,它的意思是“对象的大小为char”。一个char可能超过8位,也可能超过一个八位字节,但始终为一个字节。
gnasher729 2014年

9

是PDP-10 和PDP-11

更新:没有像PDP-10那样的C99编译器。

据报道,某些型号的Analog Devices 32位SHARC DSP具有CHAR_BIT = 32,而来自TMS32F28xx的Texas Instruments DSP具有CHAR_BIT = 16 。

更新:PDP-10GCC 3.2,CHAR_BIT = 9(请检查该存档中的include / limits.h)。


1
不要将类似但不是C的语言的实现与C混淆。您甚至说:“我对C99标准兼容感到担心。我与C99编译器紧密合作。”

2
@Roger:不公平地称不符合C99的GCC3,除非您处理的极端情况被认为是GCC中的错误。
约书亚

1
@Joshua,我认为Roger谈到了K&R和pcc历史编译器。在使用此端口进行编译时,在PDP-10上运行C99符合性测试套件之前,声称它符合C99是不公平的(移植和机器本身可能会产生错误)。但是可以预料,它将与x86上的GCC3.2接近C99标准。
osgx'2

1
@Joshua:在C99中允许CHAR_BIT大于8,但sizeof(char)仍必须为1(当我留下该评论时,此答案有很大不同)。我并不是说不符合GCC3,C89在这里也提出了相同的要求,顺便说一句。我引用该文字是说osgx是一个担心C99兼容并使用C99编译器的人,那么为什么他担心非C99编译器呢?

2
这里是PDP-10 GCC的作者。CHAR_BIT为9,但的sizeof(char)的仍为1
拉斯Brinkhoff
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.