在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.
结果sizeof 是不执行规定.标准没有说; 它说:
结果的价值是实施定义的,[...]
这在语义上是不同的.结果sizeof很明确:
[...]其操作数的大小(以字节为单位)[...]
此上下文中的字节的位宽和非char类型中的字节数都是实现定义的.