保证C数据类型的最小大小/范围

我找到了这个问题的不同答案,我知道必须有一个确定的答案。 C中四种主要数据类型的最小分配内存大小是多少? intdoublefloatchar是我的想法。 signed或未unsigned类型是否以任何方式改变大小?

你可以使用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 

注意:您获得的值可能由OS /编译器/ CPU架构决定。

ANSI C为各种原始数据类型定义了以下大小。

  • 烧焦
    • 最小签名范围:-128 .. 127
    • 最小无符号范围:0 .. 255
    • 可以更大,但无论大小,sizeof(char)== 1
    • sizeof(unsigned char)== 1
    • 最小签名范围:-32768 .. 32767
    • 最小无符号范围:0 .. 65535
    • 可以更大
    • 最小签名范围:-2147483648 .. 2147483647
    • 最小无符号范围:0 .. 4294967295
    • 可以更大
  • INT
    • 必须具有与短路相同的范围
    • 可以具有相同的范围作为长
    • 不能有一个大于长的范围
    • short <= int,int <= long,但short

浮点数和双精度数有更多规则,但一般来说,浮点数的范围是<=双精度范围(对于现代机器---浮点数是4个字节,双精度数是8)。

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

签名或未签名类型是否以任何方式改变大小?

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

  • 签署-32,768至+32,767
  • 无符号0到65,535

这是一个很好的问题。 我推荐你到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不需要它。 但是如果你的字符大小是32位,那么sizeof(float)可能只有1。

  • 签名/未签名不会更改大小。

由于这些原因, 是C语言最重要的新增function之一。 在此之前,编写跨平台代码非常困难。

写一个小测试程序,亲眼看看:

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