2012-02-25 38 views
9

Tôi đã nhận thấy rằng nếu tôi tạo một int có giá trị lớn, loại động của đối tượng có vẻ là Số.Trong Actionscript 3, tại sao là loại động của các giá trị int lớn Số?

Ví dụ:

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" 

được gì xảy ra ở đây? Cả hai giá trị đều nằm dưới mức maximum value of an int, là 2.147.483.647 (2^31-1).

Trả lời

16

Điều đang xảy ra là máy ảo AS3 sử dụng 32 bit "nguyên tử" để lưu trữ các giá trị của các loại nguyên thủy.

3 trong số 32 bit đó được sử dụng để mô tả loại, có nghĩa là còn 29 bit.

int là loại đã ký - sử dụng 1 bit cho dấu - để lại 28 bit cho số nguyên dương. Làm cho số lượng cao nhất mà bạn có thể viết trong 28 bit còn lại:

0x0FFFFFFF = 268435455 

Ngay sau khi số nguyên cần hơn 29 bit, các nguyên tử bị thay đổi bởi VM vào một loại Number (mà thực sự là đại diện như một 29 con trỏ bit đến phao chính xác đôi 64 bit thực tế). Vì vậy, giá trị được định nghĩa là "giá trị tối đa của int" không thực sự có ý nghĩa nhiều (vì Number có thể lưu trữ giá trị tích phân lên tới 53 bit, nhưng int sẽ giới hạn giá trị đó thành 32) - khác với về:

  • giao tiếp với ngôn ngữ/công nghệ khác (mà chủ yếu sử dụng 32 bit cho số nguyên của họ)

  • làm cho kết quả (chủ yếu) có thể dự đoán để các lập trình viên sử dụng để số nguyên 32 bit; và

  • chống tương lai (trong trường hợp thay đổi biểu diễn bên trong trong tương lai).

Là một sidenote, có khá một vài đặc thù với ints và số - bao gồm cả điều này:

var i:Number = 2.0; 

... được lưu giữ như int cho đến khi số thập phân được thực sự cần thiết.

+3

Rất nhiều thông tin ở đó! –

Các vấn đề liên quan