2012-02-25 5 views
9

He notado que si creo un int con un valor grande, el tipo dinámico del objeto parece ser Number.En Actionscript 3, ¿por qué el tipo dinámico de valores int grandes es Number?

Ejemplo:

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" 

¿Qué está pasando aquí? Ambos valores están muy por debajo del maximum value of an int, que es 2.147.483.647 (2^31-1).

Respuesta

16

Lo que está sucediendo es que la máquina virtual AS3 usa "átomos" de 32 bits para almacenar los valores de los tipos primitivos.

3 de esos 32 bits se usan para describir el tipo, lo que significa que quedan 29 bits.

Dado que int es un tipo con signo, que utiliza 1 bit para el signo, deja 28 bits para un entero positivo. Haciendo que el número más alto que se puede escribir en los 28 bits restantes:

0x0FFFFFFF = 268435455 

Tan pronto como el número entero necesita más de 29 bits, el átomo es cambiado por la máquina virtual en un tipo Number (que en realidad es representado como un 29 puntero de bit al flotador de doble precisión real de 64 bits).

Por lo tanto, el valor definido como "valor máximo de un int" realmente no tiene mucho sentido todo lo que (ya que Number puede almacenar valores enteros de hasta 53 bits, pero int limitará a 32) - que no sea en términos de:

  • comunican con otros idiomas/tecnologías (que en su mayoría utilizan 32 bits por sus números enteros)

  • haciendo que los resultados (en su mayoría) predecible para los programadores utilizados para enteros de 32 bits; y

  • futura (en caso de que la representación interna cambie en el futuro).

Como anotación al margen, hay bastantes peculiaridades con enteros y números - incluyendo que esto:

var i:Number = 2.0; 

... se almacena como int hasta que los decimales son realmente necesarios.

+3

¡Hay mucha información allí! –

Cuestiones relacionadas