À, chỗ này mình nhầm 1 chút. Khi thực hiện phép toán giữa 2 toán hạng thì trình biên dịch sẽ tự động typecast kiểu của biểu thức sang kiểu của toán hạng lớn nhất, và thứ tự thực hiện các phép toán là từ trái sang phải theo độ ưu tiên toán tử. Lỗi chính xác phải là như thế này:
a+a+b => integer + integer + longint => (integer + integer) + longint => (integer + integer) bị tràn (40000) trước khi compiler typecast (integer+integer) sang kiểu longint để cộng với kiểu longint phía sau.
Cái này vốn dĩ ko phải là lỗi của trình biên dịch. Bạn thử bằng compiler mới nhất của Borland là CodeGear Delphi 2007 với kiểu integer (32bit) và int64 (64bit) sẽ thấy kết quả tương tự. Turbo Pascal ko thể dùng kiểu nguyên mặc định là longint (32 bit) vì nó là compiler 16 bit, kiểu nguyên mặc định của nó có độ dài 16 bit (integer), tương ứng 1 thanh ghi 16 bit (AX, BX, CX,...). Nếu bạn dùng compiler 32 bit (Delphi, Free Pascal 32) thì kiểu nguyên mặc định lúc này vẫn là integer nhưng có độ dài 32bit, tương ứng với 1 thanh ghi 32 bit (EAX, EBX, ...). Kiểu longint lúc này thực chất là 1 tên gọi khác của kiểu integer, và kiểu nguyên lớn hơn integer là int64 (64 bit). Tương tự, nếu bạn dùng compiler 64bit (chạy trên các OS 64bit - kiến trúc AMD64/EMT64) thì kiểu nguyên mặc định có độ dài 64bit.
Nếu bạn dùng Free Pascal 16 thì bạn cũng sẽ nhận được kết quả giống như Turbo Pascal, Turbo C hay các compiler 16bit khác thôi. Đây là lỗi do mã lệnh của lập trình viên, ko phải lỗi của compiler.
Bookmarks