编译后的C数据类型大小

时间:2017-08-14 22:57:44

标签: c assembly compilation low-level

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

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

我一直认为编译只是建立所有实施细节和设置过程的过程。内存中数据类型的确切大小和内部格式,但我想要一些确认。此外,这是否也适用于C ++?

3 个答案:

答案 0 :(得分:2)

在C级以下,编译器还遵守一些“应用程序二进制接口”(缩写为ABI;不要误认为是API)。这就是这些细节的基础。应用程序二进制接口定义类型的大小和整数的表示,在其他事物的 lot 中,例如如何将参数传递给函数。

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

原则上C ++也是如此。

答案 1 :(得分:1)

  

如果我要从具有相同操作系统和兼容CPU的不同机器运行相同的已编译可执行文件,我是否可以保证该变量在任何时候都是4字节宽,格式完全相同

C标准不保证,但它会。这将由编译的机器代码确定。

答案 2 :(得分:1)

在各个地方,C标准要求编译时可用的任何信息必须是" as-if"贯穿所有可能的执行环境。这至少包括:

  • 所有类型(sizeof_Alignof的尺寸和对齐方式,但有方法可以在不使用后者的情况下进行对齐。
  • 算术类型的值范围,因为它们可以通过#include <limits.h>#include <float.h>访问。
  • 如果值范围和大小限制它,内部布局(负数的补码格式,以及没有填充位/陷阱表示)。例如,如果SCHAR_MIN是-128(它只需要&lt; = -127)而CHAR_BIT是8,那么你可以保证2位补码8位{{1 }}。

但是,基于运行时系统,可以有很多东西(无论是在理论上,还是在实际上)。