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

时间:2013-02-11 15:24:01

标签: c variables

我找到了这个问题的不同答案,我知道必须有一个确定的答案。 C中四种主要数据类型的最小分配内存大小是多少?我正在考虑intdoublefloatcharsignedunsigned类型会以任何方式改变大小吗?

6 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

  

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

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

这是一个很好的问题。我推荐你到C99 6.2.5。 Wikipedia C data types文章很好。

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

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

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

答案 5 :(得分:-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)。符号不影响大小,只有解释。