2012-04-18 39 views
14

xem xét:Tại sao "i: = i + 1" không cung cấp lỗi kiểm tra phạm vi cho Số nguyên và loại lớn hơn?

{$R+} 
i:= 1; 
While i > 0 do 
    i:= i + 1; 
ShowMessage(IntToStr(i)); 

Nếu Tôi tuyên bố i như Byte, Word, Shortint hoặc tinyint tôi nhận được một lỗi phạm vi kiểm tra, như mong đợi. Nếu tôi khai báo i là LongWord, Cardinal, Integer, LongInt hoặc Int64, nó chỉ đi qua vòng lặp while và hiển thị giá trị âm hoặc 0, mà i nhận được khi bạn vượt qua giới hạn trên.

Có phải Delphi 7 không hỗ trợ kiểm tra phạm vi cho số 32 bit và 64 bit không?

Trả lời

13

Thao tác i + 1 không thực sự tạo ra lỗi kiểm tra phạm vi. Thao tác gán không.

Delphi đánh giá hằng số '1' làm số nguyên và do đó phía bên tay phải sẽ tạo ra kết quả là Int64 hoặc số nguyên (Lớn hơn kiểu i và số nguyên).

Nếu chúng ta mở rộng dòng ra chúng tôi nhận được sau

temp := i + 1 
i := temp 

tạm thời hoặc sẽ được 32 hoặc 64 bit, và sẽ tràn nếu nó chạm trên ràng buộc. Vào thời điểm chúng tôi thực hiện nhiệm vụ, chúng tôi có giá trị 32 hoặc 64 bit hoàn toàn hợp lệ để không có khả năng xảy ra lỗi kiểm tra phạm vi nếu tôi là 32bits trở lên.

Nếu tôi nhỏ hơn 32 bit, nó sẽ tăng kiểm tra phạm vi nếu nhiệt độ quá lớn để vừa.

Đối với i> = 32bits, bạn có thể bắt lỗi tràn bộ nhớ như vậy:

{$R+,Q+} 
... 
+0

Cám ơn lời giải thích của bạn mà giúp với một số hướng. Tôi đã làm một số thử nghiệm nhiều hơn, thay vì thêm i + 1 tôi đã thêm i + j với cả i và j cùng loại. Điều này dẫn đến cùng một vấn đề. Vì vậy, tôi muốn nói toán tử "+" làm cho kết quả là một số nguyên. Điều lạ lùng: nếu tôi sử dụng Inc (i), thì dù tôi sử dụng loại nào, tôi cũng không gặp lỗi rangecheck. Tôi tìm thấy {$ Q +} để cho tôi một ngoại lệ tràn số nguyên. –

+0

Xin lỗi, có, đó phải là một Q, không phải là O :) – JamesT

+2

Vì vậy, cuối cùng tôi đã sử dụng công cụ sai cho công việc và nên đã được tìm kiếm một tràn thay vì một rangecheck. –

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