actionscript-3 - 在ActionScript 3中,为什么大int值的动态类型为Number?

标签 actionscript-3 int

我注意到,如果我创建一个具有大值的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位)-除了以下方面:
  • 与其他语言/技术(大多数情况下使用32位整数)进行通信
  • 使结果(大多数情况下)对于习惯32位整数的程序员而言是可预测的;和
  • 面向 future 的证明(以防内部表示将来发生变化)。

  • 附带说明一下,int和Numbers有很多特性-包括以下几点:
    var i:Number = 2.0;
    

    ...以int形式存储,直到实际需要小数为止。

    关于actionscript-3 - 在ActionScript 3中,为什么大int值的动态类型为Number?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9447517/

    相关文章:

    actionscript-3 - AS3 > 鼠标事件没有发生?

    javascript - 有没有办法检查 ExternalInterface 是否可以从 javascript 获得?

    java - 正确的return使用方法是什么?

    c - 你好.c : In function ‘main’ : Hello. c :13: warning: return type of ‘main’ is not ‘int’ ?

    actionscript-3 - Flash中的Youtube Chromeless Player控件

    actionscript-3 - Actionscript 3,多音轨

    apache-flex - 获取正在运行的进程列表,获取事件进程(及其应用程序) Flex/AIR

    c - sqrt() - 为什么我可以提供 int 参数而不仅仅是 double 并且输出也是正确的?

    Objective-C:无故改变int值

    java - 反转最后一位