【问题标题】:How is the data type and size stored in memory?数据类型和大小如何存储在内存中?
【发布时间】:2013-07-03 01:32:02
【问题描述】:
double a;
unsigned int b;

在运行期间,操作系统如何知道有多少字节与这些变量相关联,以及应该如何解释它们的位?如果这与语言/操作系统相关,请在 Windows 上假设 C。

是否有将变量标识符的位表示映射到字节大小和数据类型的 LUT?从 uC 上的汇编编程中,我记得编译器神奇地知道分配给变量的字节数,并适当地执行零填充等。

【问题讨论】:

    标签: memory-management assembly types


    【解决方案1】:

    就操作系统而言,这些只是内存块。除了“随机位串”之外,它对它们包含的内容一无所知。

    智能都在编译器中 - 编译器跟踪变量的类型,然后为适当的字节数生成加载和存储指令,并生成对适当大小和编码方案的操作数进行操作的代码(例如,它知道在 unsigned int 上使用无符号加法运算而不是有符号运算)。

    【讨论】:

    • @sixstring91 只是为了详细说明 Gian 的注释,在 C 等语言中,编译器可以计算出所有内容。当你有代码的时候,关于什么数据类型的知识基本上都内置在机器代码的行为中。没有明确指示该级别的数据类型是什么。但是,当您使用 C++ 和其他具有运行时类型检查、对象/类等的语言时,会在内存中设置结构,这些结构会在运行时告诉软件其他类型和结构是什么。
    【解决方案2】:

    它取决于语言和编译器。如今,unsigned int 是 32 位的,但这并不总是取决于语言、编译器和目标的规则。如果您要在较旧的 8086 或 16 位处理器(微控制器)上使用 int,则 int 可能是 16 位。双人房更标准一点。假设一个 IEEE 754 浮点数单是 32 位和双 64 位。但它又取决于语言、编译器和目标。

    如果像这样背靠背定义,那么这些之间的任何填充也是语言、编译器和目标相关的。假设它们分别是 64 位和 32 位,编译器可能不会费心填充任何东西,因为在 32 位边界上很好地排列(基于您提供的两行的大假设)。但它可能会选择放置 32 位填充,以便两者都是 64 位对齐的。

    【讨论】:

    • 这到底为什么会被否决?这是一个完全合理的答案。为伟大的正义投票。
    猜你喜欢
    • 2018-02-12
    • 2011-01-07
    • 1970-01-01
    • 2022-12-01
    • 2019-07-19
    • 1970-01-01
    • 1970-01-01
    • 2015-10-01
    • 2019-02-28
    相关资源
    最近更新 更多