是否有机器,其中sizeof(char)!=1,或至少字符位>;8.

是否有机器,其中sizeof(char)!=1,或至少字符位>;8.,c,char,standards,sizeof,c99,C,Char,Standards,Sizeof,C99,是否存在sizeof(char)!=1 C99标准是否规定标准合规性实施的sizeof(char)必须正好为1?如果有,请给我章节号和引文 更新: 如果我有一台机器(CPU),它不能寻址字节(最小读取为4字节,对齐),但只有4-s字节(uint32\u t),那么这台机器的编译器可以将sizeof(char)定义为4吗sizeof(char)将为1,但char将有32位(char\u位macros) 更新2: 但sizeof结果不是一个字节!它是字符的大小。字符可以是2字节,也可以是7位 更新3

是否存在
sizeof(char)!=1

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

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

更新2: 但sizeof结果不是一个字节!它是字符的大小。字符可以是2字节,也可以是7位

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

它总是在C99第6.5.3.4节中的一个:

当应用于具有 键入char、unsigned char或signed char 字符(或其合格版本) 结果是1

编辑:不是你问题的一部分,而是为了引起Harbison和Steele的兴趣,第三版(c99之前)。148:

存储单元被视为 一个用户占用的存储量 性格物体的大小 因此,type
char
为1

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

允许有一个C吗 可以使用哪种类型的
char
实现 表示从 -2147483648到2147483647?如果是这样,什么是
sizeof(char)
在这项实施下?你会怎么做 是最小和最大范围的 键入
int

答复(同上,第382页):

这是允许的(如果浪费) 使用32位实现 表示类型
char
。不管 实施,价值
sizeof(char)
始终为1

虽然这并没有具体解决这样一种情况,即字节是8位,
char
是其中的4位(对于c99定义,实际上是不可能的,请参见下文),但c99标准和Harbison and Steele始终清楚
sizeof(char)=1
这一事实

编辑:事实上(这是对upd 2问题的回答),就c99而言,
sizeof(char)
是以字节为单位的,请参见第6.5.3.4节:

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

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

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

其实现定义值的大小应等于或大于(我的重点)所示值,并带有相同的符号

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

-类型为signed char的对象的最小值

**SCHAR_MIN -127//−(27−1)** 
**SCHAR_MAX +127//27−1** 
**UCHAR_MAX 255//28−1** 
-类型为signed char的对象的最大值

**SCHAR_MIN -127//−(27−1)** 
**SCHAR_MAX +127//27−1** 
**UCHAR_MAX 255//28−1** 
-类型为unsigned char的对象的最大值

**SCHAR_MIN -127//−(27−1)** 
**SCHAR_MAX +127//27−1** 
**UCHAR_MAX 255//28−1** 
-char类型的对象的最小值

**CHAR_MIN**    see below 
**CHAR_MAX**    see below
-char类型的对象的最大值

**CHAR_MIN**    see below 
**CHAR_MAX**    see below
[……]

如果类型为char的对象的值 当 在表达式中使用的值 字符最小值应与 SCHAR_MIN和CHAR_MAX的值 应与制造商的相同 SCHAR_MAX.否则,值 CHAR_MIN应为0,且 CHAR_MAX应与 UCHAR_MAX.值UCHAR_MAX 应等于2^CHAR\u位− 一,


没有
sizeof(char)
为4的机器。它总是1字节。该字节可能包含32位,但就C编译器而言,它是一个字节。要了解更多细节,我实际上会告诉你。这个链接覆盖得相当好,我相当肯定C++从C中得到所有这些规则。你也可以查看大于8位的字符。

Upd2:但结果的大小不是一个字节 ! 它是字符的大小。而char可以 是2字节还是(可能)7位?

是的,是字节。让我再说一遍<根据C编译器,code>sizeof(char)
是1字节。人们通常所称的字节(8位)不一定与C编译器所称的字节相同。一个C字节中的位数取决于您的机器体系结构。它还保证至少是8。PDP-10和PDP-11是

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

一些型号的模拟设备32位SHARC DSP的字符位=32,并且 来自TMS32F28xx的德州仪器DSP具有字符位=16

更新:字符位=9时存在错误
(检查档案中的include/limits.h)。

我担心C99是否符合标准。我与C99编译器密切合作,因为Unicode变得更加重要,可能会出现使用Unicode字符作为
char
(而不是
wchar
)的非标准编译器,即使标准规定
sizeof(char)
必须为1,我也不会依赖这种假设。没有C编译器的sizeof(char)不是1,unicode与否。@Chip:
sizeof(char)
始终为1,即使char为32位(在某些系统上也是如此)。C有很多有趣的缺点。C标准的所有版本都要求字符位至少为8;您不能让CHAR_BIT==7并符合标准。然而,机器的字符位>8是完全可行的。我相信旧的克雷机器是这样做的(
sizeof(char)==sizeof(short)&&sizeof(char)==sizeof(int)
;我不记得是
sizeof(int)==sizeof(long)
还是char\u位是32还是64;我想是32,我想是
siz>