3

对于这个问题,我找到了不同的答案,而且我知道肯定有一个明确的答案。C 中四种主要数据类型的最小分配内存大小是多少?int, double, float, 和char是我的想法。signedor类型是否unsigned以任何方式改变大小?

4

6 回答 6

9

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)。

于 2013-02-12T02:23:52.513 回答
2

有符号或无符号类型是否以任何方式改变大小?

不会。它只影响保存的数据范围。有关短数据类型(2 个字节),请参见下面的示例。

  • 签名 -32,768 至 +32,767
  • 无符号 0 到 65,535
于 2013-02-11T15:29:28.287 回答
2

只有标准char保证是1字节。
其余类型具有实现定义的大小。

于 2013-02-11T15:25:12.723 回答
1

这是一个很好的问题。我建议您参考 C99 6.2.5。维基百科 C 数据类型文章很好。

  • char 足够大,可以存储基本执行字符集的任何成员。它不是一个字节(由 8 位定义),考虑它的一个好方法是它是最小可寻址/可分配单元(MAU),正如您在问题中所写,但在某些系统上不是一个字节.
  • 整数有点有趣。我认为它们应该至少保持 2^15-1(16 位),但我目前在 C99 中找不到它。在标准的较新版本中,我相信它们实际上被定义为至少 32 位,因为很多人都认为它们是。但总的来说,您必须假设它们是根据 MA​​U ( 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 语言最重要的新增功能之一。在此之前,编写跨平台代码非常困难。

于 2013-02-11T17:23:35.537 回答
0

您可以使用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 架构决定。

于 2013-02-11T15:25:47.130 回答
-1

写一个小测试程序,自己看看:

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)。符号不影响大小,只影响解释。

于 2013-02-11T15:29:00.327 回答