c中数据类型的大小

时间:2009-11-06 10:15:12

标签: c size

数据类型硬件体系结构的大小是依赖还是依赖于编译器?

我想知道哪些因素对确定数据类型的大小有实际影响?

7 个答案:

答案 0 :(得分:3)

编译器(更恰当地说是“实现”)可以自由选择大小,受C标准的限制(例如int必须至少为16位)。编译器可以选择使其自身符合其他标准,如POSIX,它可以添加更多约束。例如,我认为POSIX表示所有数据指针大小相同,而C标准对sizeof(int*) != sizeof(char*)非常满意。

在实践中,编译器 - 编写者的决策受到体系结构的强烈影响,因为除非有强烈的理由否则他们希望实现高效且可互操作。处理器制造商或操作系统供应商经常发布称为“C ABI”的东西,它告诉您(除其他外),类型有多大以及它们如何存储在内存中。编译器永远不必为其架构遵循标准ABI,并且CPU通常具有多个公共ABI,但是直接从一个编译器中的代码调用以编码另一个编译器,两个编译器必须使用相同的ABI。因此,如果您的C编译器不在Windows上使用Windows ABI,那么您需要额外的包装器来调用Windows dll。如果您的编译器支持多个平台,那么很可能在不同平台上使用不同的ABI。

您经常会看到用于表示正在使用多个ABI中的哪一个的缩写。因此,例如当64位平台上的编译器说它是LP64时,这意味着long和指针是64位,而省略int是32位。如果它说ILP64,那意味着int也是64位。

最后,更多的情况是编译器 - 作者从一个明智的选项菜单中选择,而不是随意挑选数字。但实施总是随心所欲。如果你想为x86编写一个模拟具有9位字节和3字节字的机器的编译器,那么C标准允许它。但就操作系统而言,你只能靠自己。

答案 1 :(得分:1)

大小最终由编译器决定。例如Java有一组固定的大小(8,16,32,64),而C为各种类型提供的大小集合部分取决于它运行的硬件;即编译器做出选择但是(除了像Java这样的情况,其中数据类型明确独立于底层硬件)受到硬件提供的强烈影响。

答案 2 :(得分:0)

不同数据类型的大小是编译器,它的配置,依赖(不同的编译器,或不同的开关到同一个编译器,在某些机器上可以有不同的大小)。

通常编译器与其安装的硬件相匹配......因此您可以说类型的大小也取决于硬件。使编译器在48位的机器上发出16位指针会产生反作用 但是可以在计算机上使用编译器来创建一个程序,以便在不同大小的不同计算机上运行。

答案 3 :(得分:0)

这取决于目标硬件架构,操作系统以及可能的编译器。

intel编译器按如下方式调整一个长整数:

 OS            arch         size
Windows       IA-32        4 bytes
Windows       Intel 64     4 bytes
Windows       IA-64        4 bytes
Linux         IA-32        4 bytes
Linux         Intel 64     8 bytes
Linux         IA-64        8 bytes
Mac OS X      IA-32        4 bytes
Mac OS X      Intel 64     8 bytes  

此处为显示microsoft visual c++ compiler上的尺寸的链接。

答案 4 :(得分:0)

您的问题的答案是 ,我会解释。

考虑常见的存储类型,即size_t,int64_t等。这些在编译时决定(在大多数情况下定义),具体取决于您构建的体系结构。没有它们?不用担心,编译器会弄清楚int的基本含义以及无符号的影响。

一旦标准C标头找出所需的字长,一切都只是调整到您的系统。

当然,除非您恰好是交叉编译,否则它们将由您指定的任何架构决定(或定义)。

简而言之,您的编译器(主要是预处理器)将调整类型以适应目标体系结构。无论是你正在使用的那个,还是你正在编译的那个。

这是如果我正确理解你的问题。这是该语言提供的为数不多的“神奇”抽象之一,也是其经常被称为“便携式装配”的部分原因。

答案 5 :(得分:0)

“native”数据类型的大小取决于编译器。虽然这反过来受硬件的影响,但我不会开始猜测。

查看<stdint.h> - 该标题具有与平台无关的typedef,可满足您的任何需求。

答案 6 :(得分:0)

\\它完全依赖于编译器。

或者更准确地说C语言标准依赖(http://en.wikipedia.org/wiki/C99)。

在标准中明确指定了bult-in类型的大小。 但。它们并非固定在“那么一个人”的基础上 任何架构上的任何编译器都需要保留最小尺寸(例如 char 至少为8位)。
但它也可以是16或甚至32位 char 取决于arch 并且还保留了不同类型之间的相关尺寸 这意味着,例如 short 可以是8位,16位或32位,但它的长度不能超过同一架构上更宽的类型 int 。 /> 只有更小或相同的长度。

如果他们想要制作C标准兼容的编译器,那么编译器开发人员必须工作的边界。