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) = 1
c99标准和Harbison和Steele总是很清楚.
编辑:事实上(这是对你的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**
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.
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.
PDP-10 和PDP-11是.
更新:没有像PDP-10那样的C99编译器.
据报道,某些型号的ADI公司32位SHARC DSP的CHAR_BIT = 32,而TMS32F28xx的德州仪器DSP的CHAR_BIT = 16 .
更新:PDP-10有GCC 3.2,CHAR_BIT = 9(在该存档中检查include/limits.h).