102

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

C99 标准是否规定sizeof(char)在标准合规性实施上必须恰好为 1?如果是的话,请给我章节号和引文。

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

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

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

4

3 回答 3

98

在 C99 第 6.5.3.4 节中它始终为 1:

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

编辑:不是您问题的一部分,而是出于Harbison 和 Steele 的兴趣。C:参考手册,第三版,Prentice Hall,1991(pre c99)p。148:

一个存储单元取一个字符占用的存储量;因此类型对象的大小为char1。

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

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

答案(同上,第 382 页):

允许(如果浪费的话)实现使用 32 位来表示 type char。无论实现如何, 的值 sizeof(char)始终为 1。

虽然这并没有具体解决字节是 8 位并且是其中 4 个字节的情况(在 c99 定义中实际上是不可能的,见下文),但从 c99 标准以及 Harbison 和 Steele 中始终可以清楚地char看到这一事实。sizeof(char) = 1

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

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

因此结合上面的引用,8 位字节和char其中 4 个字节是不可能的:对于 c99,一个字节与 a 相同char

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

它们的实现定义的值在大小上应等于或大于所示的值,具有相同的符号。

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

 **CHAR_BIT 8**

— 有符号字符类型对象的最小值

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

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

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

— unsigned char 类型对象的最大值

**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。

于 2010-02-07T01:03:58.303 回答
23

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

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

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

于 2010-02-07T01:57:30.130 回答
12

PDP-10和 PDP-11是。

更新:PDP-10 没有 C99 编译器。

据报道,Analog Devices 32 位 SHARC DSP 的某些型号具有 CHAR_BIT=32,而 TMS32F28xx 的德州仪器 DSP 具有 CHAR_BIT=16 。

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

于 2010-02-07T02:41:00.240 回答