Javascript V8如何存储像5这样的整数?

Javascript V8如何存储像5这样的整数?,javascript,memory,memory-management,v8,Javascript,Memory,Memory Management,V8,V8如何在内存中存储整数 例如整数5 我知道它存储在堆中,但它到底是如何存储的? 比如元数据和实际值本身。 在存储int之前是否有一个常量添加到int中?在Javascript中,所有数字都存储为64位浮点值。C和C++调用这个类型双< /代码>。没有明显的“整数”类型 在某种程度上,您可以简单地使用整数值并获得预期的结果,而不必担心舍入错误。这些整数称为“安全”整数 如前所述,范围[-(2^53-1),+(2^53-1)]中的所有整数都是“安全”整数。这意味着,如果在该范围内对整数进行加法、减

V8如何在内存中存储整数

例如整数5

我知道它存储在堆中,但它到底是如何存储的? 比如元数据和实际值本身。
在存储int之前是否有一个常量添加到int中?

在Javascript中,所有数字都存储为64位浮点值。C和C++调用这个类型<代码>双< /代码>。没有明显的“整数”类型

在某种程度上,您可以简单地使用整数值并获得预期的结果,而不必担心舍入错误。这些整数称为“安全”整数

如前所述,范围[-(2^53-1),+(2^53-1)]中的所有整数都是“安全”整数。这意味着,如果在该范围内对整数进行加法、减法或乘法,并且结果也在该范围内,则计算不会产生舍入误差


当然,Javascript/V8中的所有值都以某种方式“装箱”,因为变量没有类型(使用标记指针的小整数除外)。如果您有一个变量
x
,即
5.25
,它必须知道它是一个“数字”,并且该数字是5.25。因此它将占用超过8字节的空间。您必须查找v8的源代码以了解更多信息。

v8使用指针标记方案来区分小整数和堆对象指针。5将被存储为
Smi
类型,这在V8中不是堆分配的

您可以查看Smi类的,以了解更多信息

在32位平台上,SMI是一个31位有符号整数,底部位设置为0。 在64位平台上,SMI是32位有符号整数,31位填充为0,底部位填充为0。
堆对象的指针的底部位设置为1,这样V8就可以在没有额外元数据的情况下区分指针和SMI。

JavaScript中的所有数字都是8字节的浮点值。内存中的var中是否添加了某种常量?您为什么在意?像JavaScript这样的高级语言对所有这些都进行了抽象,因此对于大多数(几乎所有)目的来说,这完全无关紧要。@Pointy可能是因为知道数字的可表示范围有助于避免溢出错误。或者因为您想知道在整数除法期间是否发生截断。或者因为知道这样的细节可能会影响优化决策,或者有助于调试。或者你正在设计自己的脚本语言,想知道其他语言是如何做的。或者仅仅因为为了知识本身而获取知识没有什么错。@Ray,
m/2
2.5
,因为一切都是一个浮点数,所以这并不奇怪。另一个值为0,因为
这是不正确的。与大多数其他语言运行时一样,V8会将小整数(V8中缩写为“smi”)解装箱为单个(带标记的)字。@AndreasRossberg这可能是真的,但语言规范很明确:数字是64位双精度浮点值。内部优化对程序员来说是不透明的,否则实现就被破坏了。@尖锐、正确,但不相关,因为OP的问题明确是关于实现的,而不是语言规范。