我注意到,如果我创建一个具有大值的int,则该对象的动态类型似乎是Number。
例子:
var int1:int = 0x8000000;
var type1:String = flash.utils.getQualifiedClassName(int1); // Returns "int"
var int2:int = 0x10000000;
var type2:String = flash.utils.getQualifiedClassName(int2); // Returns "Number"
这里发生了什么?这两个值都远低于maximum value of an int(即2,147,483,647(2 ^ 31-1))。
最佳答案
这是因为AS3虚拟机使用32位“原子”来存储基本类型的值。
这32位中的3位用于描述类型,这意味着还剩下29位。
由于int
是带符号的类型-使用1位作为符号-留下28位为正整数。在剩下的28位中可以写出最高的数字:
0x0FFFFFFF = 268435455
一旦整数需要超过29位,VM便将原子更改为
Number
类型(实际上表示为指向实际64位 double 浮点数的29位指针)。因此,定义为“int的最大值”的值实际上并没有多大意义(因为
Number
可以存储最多53位的整数,但是int
会将其限制为32位)-除了以下方面:附带说明一下,int和Numbers有很多特性-包括以下几点:
var i:Number = 2.0;
...以int形式存储,直到实际需要小数为止。
关于actionscript-3 - 在ActionScript 3中,为什么大int值的动态类型为Number?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9447517/