编译后的 C 数据类型大小

标签 c assembly compilation low-level

问题如下:C 编程语言是否定义了编译器生成的可执行文件应如何根据数据大小类型进行格式化?为了更好地解释这一点,我们假设我编译了一个 C 源代码文件,其中包含一个名为“x”的 int 类型变量。我成功地将源代码编译成可执行文件并运行它。在运行时,为“x”分配的内存位置为 4 字节宽,并根据 2 的补码标准进行结构。

如果我要从具有相同操作系统和兼容 CPU 的不同计算机运行相同的已编译可执行文件,我是否可以保证该变量始终为 4 字节宽且格式完全相同(意味着完全相同的位占用空间)?我知道 C 的基本类型的数据大小是可变的,并且这只适用于预编译的代码。但是编译后的代码呢?如果 int 在一台机器上转换为汇编器 DWORD 数据类型并为其分配 32 位,是否可以保证它在另一台机器上会采用 32 位的形式? DWORD 在同一型号的不同 CPU 中是否始终相同?

我一直认为编译只是建立所有实现细节并“一成不变”内存中数据类型的确切大小和内部格式的过程,但我想得到一些确认。另外,这也适用于 C++ 吗?

最佳答案

在 C 级别以下,编译器还遵守一些“应用程序二进制接口(interface)”(缩写为 ABI;不要误认为 API)。这就是将这些细节固定下来的原因。应用程序二进制接口(interface)定义了类型的大小和整数的表示,以及许多其他内容,例如如何将参数传递给函数。

单个平台可以支持多个 ABI。例如,在 Windows 上,您拥有 native ABI,并且可以安装 Cygwin,它允许您使用更接近 Linux 的 ABI 运行程序。但是,假设两台不同的机器支持相同的 ABI,那么可以保证它们之间共享可执行文件能够正常工作(假设存在所需的库等),并且保证所有内容都具有兼容的表示形式。

这对于 C++ 来说原理上是相同的。

关于编译后的 C 数据类型大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45684220/

相关文章:

C/Linux : setgid leaves root in list of groups

c++ - 在未初始化局部变量的情况下,Windows 线程堆栈保护页面机制如何工作?

c++ - 是否有标准方法可以在编译时确定系统是 32 位还是 64 位?

asp.net - 阻止 ASP.NET 网站项目使用 Web.config 构建某些目录?

c# - 从 C 获取字节数组到 C#

python - 在 Python 中解析 C 函数

c - 从汇编语言编写 C 程序

C 编译错误 - "fgetc & fputc too few arguments"

c - 如何将我从C文件中读取的数据保存在数组中

c - 汇编零错误——switch语句