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

osg*_*sgx 90 c standards sizeof c99 char

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

Update3: 好的.所有机器都有sizeof(char) == 1.但机器有CHAR_BIT > 8什么?

Ram*_*nka 89

它始终是C99第6.5.3.4节中的一个:

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

编辑:不是你的问题的一部分,而是来自Harbison和Steele,第3版的兴趣.(前c99)p.148:

存储单元被视为一个字符占用的存储量; char因此,类型对象的大小为1.

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

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

答案(同上,第382页):

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

虽然这并没有专门解决这样一种情况,即字节是8位并且char是这些字节中的4个(实际上不可能使用c99定义,见下文),但事实上sizeof(char) = 1c99标准和Harbison和Steele总是很清楚.

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

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

所以结合上面的引用,8位字节和char4个字节是不可能的:对于c99,一个字节与a相同char.

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

它们的实现定义值应与所示的值相等或更大 [我的强调],具有相同的符号.

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

 **CHAR_BIT 8**
Run Code Online (Sandbox Code Playgroud)

- signed char类型对象的最小值

**SCHAR_MIN -127//?(27?1)** 
Run Code Online (Sandbox Code Playgroud)

- signed char类型的对象的最大值

**SCHAR_MAX +127//27?1** 
Run Code Online (Sandbox Code Playgroud)

- unsigned char类型对象的最大值

**UCHAR_MAX 255//28?1** 
Run Code Online (Sandbox Code Playgroud)

- char类型对象的最小值

**CHAR_MIN**    see below 
Run Code Online (Sandbox Code Playgroud)

- char类型对象的最大值

**CHAR_MAX**    see below
Run Code Online (Sandbox Code Playgroud)

[...]

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

  • 附加说明.有一个CHAR_BITS宏,可以告诉你你的字符有多少位. (9认同)
  • 总是使用sizeof并不是一个好主意,这是多余的. (3认同)
  • 如果你知道你正在使用char类型,并且你知道语言要求它们的大小为1,那么为什么总是把冗余sizeof(char)放在一个好主意? (2认同)
  • @罗杰。当然,一般来说,使用“sizeof”对于实现独立性非常重要。是的,考虑到上述所有情况,“char”有点例外,可以安全地假设“sizeof(char)=1”。我说“好主意”是因为:(a)如果有人后来改变使用,例如“long”,它会降低出错的机会,因为“sizeof(char)”起到提醒作用,(b)代码阅读器,例如OP,他不确定“sizeof(char)”,不会浪费时间担心代码是否正确,(c)当前的非标准或未来的实现(不太可能)。无论如何,这就是我习惯的原因。 (2认同)
  • (a) 和 (c) 具有更严重的后果,无法解决,甚至无法解决;还有雅格尼。(b) 中的人只需要被告知一次——我不需要在我的代码的每一行中教他们。然而,使用“sizeof(char)”也有缺点:这是另一个需要争论/检查/等的项目。在你的编码约定/标准/指南中,浪费我的时间想知道你是否真的了解C以及还有什么可能是不正确的,占用视觉/心理/文本行“带宽”。 (2认同)
  • @Ramashalanka:是的,编译后的代码是等效的。这都是围绕可读性以及人们如何使用我正在谈论的源代码的问题。(FWIW,我认为你在这里有一个不错的+1答案,我只是发现“总是使用 sizeof(char)”被误导,对我来说是一个热门问题,即使是一个小问题。) (2认同)
  • @Ramashalanka:我认为这是一个主观的事情。如果有人真的想使用它,并且在其余时间一直使用它,那很好。但在我看来,这是没有意义的,因为如果你不能相信“sizeof(char) == 1”会保持不变,那么你就不能真正相信任何东西。 (2认同)

Mic*_*fik 20

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

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

是的,它是字节.让我再说一遍. sizeof(char)根据C编译器是1个字节.人们通俗地称之为字节(8位)的内容不一定与C编译器调用字节的内容相同.C字节中的位数因机器架构而异.它也保证至少8.

  • @osgx,我倾向于像人们试图混合使用C和C++时那样尖叫.但我认为**在这种情况下**一个C++ FAQ条目同样适用于C. (10认同)
  • "8位"的正确名称是八位字节.C标准使用单词"byte"作为char的大小的对象.其他人可能以不同的方式使用"byte"这个词,通常当它们的意思是"八位字节"时,但在C(和C++,或Objective-C)中,它意味着"对象是char的大小".char可能超过8位,或多于一个八位字节,但它总是一个字节. (3认同)
  • 请!!!C++是C(C99)中真正不同的语言.这个问题仅涉及普通C. (2认同)

osg*_*sgx 9

PDP-10 和PDP-11是.

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

据报道,某些型号的ADI公司32位SHARC DSP的CHAR_BIT = 32,而TMS32F28xx的德州仪器DSP的CHAR_BIT = 16 .

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

  • @Roger:不公平地称不符合C99的GCC3,除非您处理的极端情况被认为是GCC中的错误。 (2认同)
  • @Joshua,我认为 Roger 谈到了 K&R 和 pcc 历史编译器。在使用此端口编译时,在 PDP-10 上运行 C99 合规性测试套件之前声称它符合 C99 也是不公平的(可能存在来自移植和机器本身的错误)。但预计它会像 x86 上的 GCC3.2 一样接近 C99 标准。 (2认同)
  • PDP-10 GCC 的作者在这里。CHAR_BIT 是 9,但 sizeof(char) 仍然是 1。 (2认同)