是否有机器(或编译器),在哪里 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 ?

有帮助吗?

解决方案

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

当应用于具有字符,未签名的char或签名char(或合格版本)的操作数时,结果为1。

编辑:不是你问题的一部分,但出于哈比森和斯蒂尔第三版的兴趣。(c99 之前) p.148:

存储单元被视为一个字符所占据的存储量;类型对象的大小 char 因此是 1。

编辑:为了回答您更新的问题,哈比森和斯蒂尔的以下问题和答案是相关的(同上,Ex.第 4 章。6):

可以在哪种类型中实现C实现 char 可以代表-2,147,483,648至2,147,483,647的值?如果是这样的话,会是什么 sizeof(char)根据该实施?最小,最大的类型范围是什么 int?

答案(同上,第 17 页)382):

它可以使用32位代表类型(如果浪费)(如果浪费) char. 。无论实施如何 sizeof(char) 始终为 1。

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

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

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

所以结合上面的引用,8位字节和 char 因为其中 4 个字节是不可能的:对于 c99 来说,一个字节与一个相同 char.

回答你提到的 7 位的可能性 char:这在 c99 中是不可能的。根据该标准第 5.2.4.2.1 节 最低限度 是 8:

它们的实现定义值应相等 或更大 [我的重点]与所示的大小相同,符号相同。

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

 **CHAR_BIT 8**

—signed char 类型对象的最小值

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

—signed char 类型对象的最大值

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

其他提示

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

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

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

等离子-10 和PDP-11 曾是。

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

模拟设备的一些模型32位Sharc DSP具有CHAR_BIT = 32,而TMS32F28XX的Texas Instrument dsp具有Char_bit = 16, 据说.

更新:有 PDP-10 的 GCC 3.2 使用char_bit = 9(在该存档中检查incepl/limits.h)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top