2014-05-13 14 views
6
const 
    minDriveFreeSpace: Int64 = 1024*1024*1024*99; 

Lỗi hoặc giới hạn tối đa của Delphi giá trị nguyên không đổi?

var 
    minDriveFreeSpace: Int64; 
begin 
    minDriveFreeSpace := 1024*1024*1024*99; 

sẽ phát ra:

[dcc32 Error] DataStoreLocator.pas(92): E2099 Overflow in conversion or arithmetic operation 

Đây có phải là một lỗi hoặc giới hạn tối đa của Delphi. giá trị nguyên không đổi?

+0

Thú vị! Dường như nó cũng liên quan đến đại diện cho đĩa spce trong tương tự (trùng lặp) câu hỏi được chỉ ra bởi David. –

Trả lời

10

Bạn cần truyền ít nhất một giá trị ở bên phải sang Int64. Ví dụ: cả hai cách biên dịch hoàn toàn tốt trên XE6:

const 
    minDriveFreeSpace = Int64(1024) * 1024 * 1024 * 99; 

var 
    minDriveFreeSpace2: Int64; 
begin 
    minDriveFreeSpace2 := Int64(1024)*1024*1024*99; 

Lưu ý rằng nó có thể là một trong các giá trị được đúc. Ví dụ, các công trình này đều cũng như:

const 
    minDriveFreeSpace = 1024 * 1024 * 1024 * Int64(99); 

này được diễn tả trong Delphi language guide (mặc dù khá kém) - nhấn mạnh tôi:

Nói chung, phép toán số học trên số nguyên trả về giá trị gõ Integer, tương đương với LongInt 32-bit. Hoạt động trả về giá trị kiểu Int64 chỉ khi được thực hiện trên một hoặc nhiều toán hạng Int64. Do đó, các mã sau đây tạo ra kết quả không chính xác:

var 
I: Integer; 
J: Int64; 
... 
I := High(Integer); 
J := I + 1; 

Để có được một giá trị trả về Int64 trong tình huống này, đúc tôi như Int64:

... 
J := Int64(I) + 1; 
+0

Cảm ơn Ken, Cách giải quyết của tôi (không xuất hiện trong câu hỏi) có một chút chi tiết hơn: P –

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