对于这个问题,我找到了不同的答案,而且我知道肯定有一个明确的答案。C 中四种主要数据类型的最小分配内存大小是多少?int
, double
, float
, 和char
是我的想法。signed
or类型是否unsigned
以任何方式改变大小?
6 回答
ANSI C 为各种原始数据类型定义了以下大小。
- 字符
- 最小有符号范围:-128 .. 127
- 最小无符号范围:0 .. 255
- 可以更大,但不管大小,sizeof(char) == 1
- sizeof(unsigned char) == 1
- 短的
- 最小有符号范围:-32768 .. 32767
- 最小无符号范围:0 .. 65535
- 可以更大
- 长
- 最小符号范围:-2147483648 .. 2147483647
- 最小无符号范围:0 .. 4294967295
- 可以更大
- 整数
- 必须至少具有与短路相同的范围
- 可以具有与 long 相同的范围
- 范围不能大于 long
- short <= int,int <= long,但是 short < long
浮点数和双精度数还有很多规则,但一般来说,浮点数的范围 <= 双精度数的范围(对于现代机器——浮点数是 4 个字节,双精度数是 8)。
有符号或无符号类型是否以任何方式改变大小?
不会。它只影响保存的数据范围。有关短数据类型(2 个字节),请参见下面的示例。
- 签名 -32,768 至 +32,767
- 无符号 0 到 65,535
只有标准char
保证是1
字节。
其余类型具有实现定义的大小。
这是一个很好的问题。我建议您参考 C99 6.2.5。维基百科 C 数据类型文章很好。
- char 足够大,可以存储基本执行字符集的任何成员。它不是一个字节(由 8 位定义),考虑它的一个好方法是它是最小可寻址/可分配单元(MAU),正如您在问题中所写,但在某些系统上不是一个字节.
- 整数有点有趣。我认为它们应该至少保持 2^15-1(16 位),但我目前在 C99 中找不到它。在标准的较新版本中,我相信它们实际上被定义为至少 32 位,因为很多人都认为它们是。但总的来说,您必须假设它们是根据 MAU (
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。
有符号/无符号不改变大小。
由于这些原因<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
注意:您获得的值可能由操作系统/编译器/CPU 架构决定。
写一个小测试程序,自己看看:
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)。符号不影响大小,只影响解释。