我注意到在这个问题上答案不尽相同,但必定存在一个权威的答案。以下是C语言四种主要数据类型的内存最小分配大小:整型int
、双精度浮点型double
、单精度浮点型float
以及字符型char
。那么signed
或unsigned
是否会影响它们的大小呢?
我注意到在这个问题上答案不尽相同,但必定存在一个权威的答案。以下是C语言四种主要数据类型的内存最小分配大小:整型int
、双精度浮点型double
、单精度浮点型float
以及字符型char
。那么signed
或unsigned
是否会影响它们的大小呢?
ANSI C定义了各种原始数据类型的以下大小。
浮点数和双精度浮点数还有更多规则,但通常情况下,float的范围<= double的范围(对于现代机器而言——float为4字节,double为8字节)。
根据标准,只有char
保证是1
字节。
其它类型的大小是由实现定义的。
有符号或无符号类型会以任何方式改变大小吗?
不会。它只影响所保存数据的范围。请参见下面的示例,其中为短数据类型(2字节)。
这是一个很好的问题。我建议您参考C99 6.2.5。Wikipedia C数据类型文章也不错。
sizeof()
)为单位的实现定义。不仅如此,规范还允许填充位(例如用于纠错)。因此,在一个8位字符系统上,如果sizeof(int)
是4,则最大的int不一定是2^31-1,因为规范允许其中一些位用作“填充”。因此,唯一确定的方法是使用limits.h
!float / double也是实现定义的,尽管double总是比float大。通常,这些被实现定义为与IEEE-754规范兼容(分别需要至少32和64位),但C99不要求。但如果你的char大小为32位,则sizeof(float)
可能只有1。
signed / unsigned不会改变大小。
<stdint.h>
是 C 语言中最重要的新添加之一。在此之前,编写跨平台代码非常困难。你可以使用 sizeof(variable)
:
例如,在我的本地机器上运行此示例:
sizeof (char) = 1
sizeof (double) = 8
sizeof (float) = 4
sizeof (int) = 4
sizeof (long) = 4
sizeof (long long) = 8
sizeof (short) = 2
sizeof (void *) = 4
编写一个小测试程序,亲自试一试:
int main(int argc, char* argv[])
{
printf("%d\n", sizeof(char) );
printf("%d\n", sizeof(int) );
printf("%d\n", sizeof(unsigned char) );
printf("%d\n", sizeof(unsigned int) );
printf("%d\n", sizeof(double) );
printf("%d\n", sizeof(float) );
return 0;
}
int、float、double
是与平台相关的(16、32、64位)。符号不影响大小,只影响解释。"%zu
,而不是%d
。sizeof
返回的是size_t
,而不是int
。 - Alexey Frunze