c中数据类型的大小

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

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

编译器(更恰当地说是“实现”)可以自由选择大小,受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标准允许它。 但就操作系统而言,你只能靠自己。

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

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

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

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

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

  OS拱形尺寸
 Windows IA-32 4个字节
 Windows Intel 64 4字节
 Windows IA-64 4个字节
 Linux IA-32 4个字节
 Linux Intel 64 8字节
 Linux IA-64 8字节
 Mac OS X IA-32 4个字节
 Mac OS X Intel 64 8字节  

这里是链接,以显示microsoft visual c ++编译器的大小。

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

看看 – 该标题具有独立于平台的typedef,它可以满足您的任何需求。

你的问题的答案是肯定的 ,我会解释。

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

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

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

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

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

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

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

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

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