为什么定义sizeof实现的结果?

uh *_*per -6 c c++ sizeof

在C99中,§6.5.3.4:

2 sizeof运算符产生其操作数的大小(以字节为单位),该操作数可以是表达式或类型的带括号的名称....

4结果的值是实现定义的,其类型(无符号整数类型)size_t<stddef.h>(和其他头文件)中定义.

在C++ 14中,§5.3.3:

1 sizeof运算符产生其操作数的对象表示中的字节数....应用于任何其他基本类型(3.9.1)的sizeof的结果是实现定义的.

唯一保证的值是sizeof(char),sizeof(unsigned char)而且sizeof(signed char)是一个.

但是,"对象表示中的字节数"对我来说似乎很不错.例如,在C99§6.2.6.1中:

4存储在任何其他对象类型的非位字段对象中的值由n × CHAR_BIT位组成,其中n是该类型对象的大小(以字节为单位)....

那么为什么它是实现定义的,如果看起来很明确?


你们当中许多人似乎误解了我的问题.我从未声称:

A)类型的大小在所有系统上定义或相同,

B)实现定义意味着它可以返回"随机值"

我在这里得到的n * CHAR_BITS是一个固定的公式.公式本身不能在实现之间改变.是的,一个int可能是4个字节或8个字节.我明白了.但是在所有实现之间,值必须n * CHAR_BITS.

Nat*_*ica 12

sizeof定义的结果是因为各种基本类型的大小是实现定义的.我们对C++中类型大小的唯一保证是

sizeof(char) = 1 and sizeof(char) <= sizeof(short) <= sizeof(int) <= 
sizeof(long) <= sizeof(long long)
Run Code Online (Sandbox Code Playgroud)

并且每种类型都具有最小值,它必须支持C11 [附件E(资料性附录)实施限制]/1

[...]所示的最小幅度应由具有相同符号的实施定义的幅度代替.[...]

#define CHAR_BIT    8
#define CHAR_MAX    UCHAR_MAX or SCHAR_MAX
#define CHAR_MIN    0 or SCHAR_MIN
#define INT_MAX     +32767
#define INT_MIN     -32767
#define LONG_MAX    +2147483647
#define LONG_MIN    -2147483647
#define LLONG_MAX   +9223372036854775807
#define LLONG_MIN   -9223372036854775807
#define MB_LEN_MAX  1
#define SCHAR_MAX   +127
#define SCHAR_MIN   -127
#define SHRT_MAX    +32767
#define SHRT_MIN    -32767
#define UCHAR_MAX   255
#define USHRT_MAX   65535
#define UINT_MAX    65535
#define ULONG_MAX   4294967295
#define ULLONG_MAX  18446744073709551615
Run Code Online (Sandbox Code Playgroud)

因此,根据标准,a int必须能够存储一个可以存储在16位中的数字,但它可以更大,而在当今大多数系统中它是32位.

我在这里得到的n * CHAR_BITS是一个固定的公式.公式本身不能在实现之间改变.是的,int可以是4个字节或8个字节.我明白了.但是在所有实现之间,值必须n * CHAR_BITS.

你是对的,但n根据C99§6.2.6.1定义

这个类型的对象n大小在哪里

强调我的

因此公式可以是固定的但n不是固定的,并且同一系统上的不同实现可以使用不同的值n.


Cli*_*ord 5

结果sizeof 是不执行规定.标准没有说; 它说:

结果的价值是实施定义的,[...]

这在语义上是不同的.结果sizeof很明确:

[...]其操作数的大小(以字节为单位)[...]

此上下文中的字节的位宽和非char类型中的字节数都是实现定义的.