数据类型和大小在内存中是如何存储的?

4
double a;
unsigned int b;

运行时,操作系统如何知道这些变量关联的字节数以及它们的位应该如何解释?如果这是与语言/操作系统相关的,假设在Windows上使用C语言。

是否有一个LUT将变量标识符的比特表示映射到字节大小和数据类型?从在uC上进行汇编编程中,我记得编译器神奇地知道为变量分配了多少字节,并相应地执行零填充等操作。

2个回答

5

就操作系统而言,这些只是内存块。它不知道它们包含什么,除了“随机位串”之外。

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


1
@sixstring91 只是稍微解释一下 Gian 的笔记,他说得很对,在像 C 这样的语言中,编译器会自动处理所有事情。当你有了代码时,数据类型的知识基本上都内置在机器码的行为中。在那个层面上,没有明确的指示数据类型是什么。然而,当你进入 C++ 和其他具有运行时类型检查、对象/类等的语言时,内存中设置了结构,告诉软件在运行时其他类型和结构是什么。 - lurker

1
这取决于语言和编译器。现在,无符号整数是32位,但并非总是如此,这取决于语言、编译器和目标。如果您在旧的8086或16位处理器(微控制器)上使用int,则int可能为16位。double比较标准。假设IEEE 754浮点数,单精度为32位,双精度为64位。但是,这仍然取决于语言、编译器和目标。
如果像这样定义了任何填充,那么它们之间的任何填充也取决于语言、编译器和目标。假设它们分别为64位和32位,则编译器可能不会打算填充任何内容,因为它们在32位边界上很好地排列(基于您提供的两行的大胆假设)。但它也可以选择放置32位填充以使两者都对齐到64位。

为什么这个回答会被踩?它是一个完全合理的答案。为了公正,我点赞了。 - Gian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接