编译过程中遇到负数时,它们是如何存储在“硬”内存中的?

问题描述 投票:0回答:1

我正在学习 C/C++,所以对于某些人来说这可能是一个基本问题,但它让我感到困惑。

这里给出了漂亮的答案,涉及我们如何解释正数和负数以及程序执行时它们在内存(RAM 内存)中的样子。

我现在想的是负数如何存储在编译后的exec二进制文件中;也就是说,当程序未执行时(不在 RAM 内存中)。

也就是说,编译后的负数是如何存储在硬件硬盘上的(所以当程序不执行时)。

编译器会在看到负数时,例如

int number = -25

,首先将其转换为2的补码(
1110 0111
),然后将其存储在exec二进制文件(硬盘)中,还是仅将其存储为25最高位设置为1(
1001 1001
),然后当程序开始执行时,当它看到最高位为1时,首先将其转换为2的补码(
1110 0111
),然后将其加载到 RAM(分配内存,等等)并开始执行?

c++ memory hardware twos-complement
1个回答
0
投票
这不是由语言指定的。只要生成的程序的行为与您键入的代码的行为相匹配,编译器就可以自由地执行任何操作。

编译器采用两种常见方法:

    将数字作为二进制补码存储在可执行文件中。
  1. 将数字直接编码为 CPU 指令的立即参数。
实际上没有任何理由在磁盘上以不同格式存储数字然后进行转换。这只会不必要地浪费 CPU 周期。当操作系统的程序加载器加载可执行文件时,它会将各个部分直接复制到内存的各个部分中。如果程序的所有数字常量都不是 CPU 可以使用的格式,则程序必须在使用它们之前进行转换。这浪费了时间,没有任何好处。

© www.soinside.com 2019 - 2024. All rights reserved.