首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C中数据类型的大小

C中数据类型的大小
EN

Stack Overflow用户
提问于 2009-11-06 18:15:12
回答 6查看 2.8K关注 0票数 4

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

我想知道决定数据类型大小的真正影响因素是什么?

EN

回答 6

Stack Overflow用户

发布于 2009-11-06 20:26:39

编译器(更确切地说是“实现”)可以自由选择大小,但要遵守C标准中的限制(例如int必须至少为16位)。编译器可以选择遵守其他标准,比如POSIX,这可以添加更多的约束。例如,我认为POSIX说所有的数据指针都是相同的大小,而C标准完全适用于sizeof(int*) != sizeof(char*)

在实践中,编译器-编写者的决策强烈地受到体系结构的影响,因为除非有强有力的理由,否则他们希望实现是有效的和可互操作的。处理器制造商或OS供应商通常发布一种称为“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标准允许这样做。但就操作系统而言,你只能靠自己了。

票数 3
EN

Stack Overflow用户

发布于 2009-11-06 18:27:30

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

票数 1
EN

Stack Overflow用户

发布于 2009-11-06 18:31:55

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

通常编译器与安装它的硬件相匹配...所以你可以说类型的大小也依赖于硬件。让编译器在48位的机器上发出16位指针会适得其反。

但是可以使用计算机上的编译器来创建一个程序,该程序将在具有不同大小的不同计算机上运行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1686655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档