是否存在 sizeof(char) != 1 或至少 CHAR_BIT > 8 的机器?
题
是否有机器(或编译器),在哪里 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)。