Khi thêm một số int32
vào số 642 bit native int
, CLR có được gia hạn hoặc không mở rộng số nguyên 32 bit không? Và quan trọng nhất: dựa trên thông tin nào nó đưa ra lựa chọn này?Kết quả của việc thêm int32 vào một int gốc 64 bit?
Tôi viết một trình biên dịch NET và đã đọc đặc tả ECMA kỹ lưỡng, nhưng không thể tìm thấy câu trả lời.
CLI chỉ hỗ trợ một tập hợp con của các loại trong các hoạt động của nó đối với các giá trị được lưu trữ trên stack đánh giá của nó:
int32
,int64
, vànative int
.
-ECMA 335, Mục I 12.1: Hỗ trợ các kiểu dữ liệu
Kể từ khi giá trị trên stack đánh giá không có thông tin về signedness của họ, hướng dẫn mà signedness của toán hạng quan trọng có hai phiên bản: một cho đã ký và một cho số nguyên chưa ký. Các hướng dẫn add
, sub
và mul
(những người không kiểm tra tràn) không cần phải quan tâm đến sự ký kết của toán hạng miễn là toán hạng có cùng kích thước và do đó chỉ có một biến thể. Tuy nhiên, các toán hạng không phải lúc nào cùng kích thước ...
ECMA 335, Mục III 1.5: Operand loại bảng khẳng định rằng một int32
và native int
có thể được thêm vào, trừ, nhân và chia. Kết quả lại một lần nữa là native int
. Trên hệ thống 64 bit, native int
rộng 64 bit.
ldc.i4.0 // Load int32 0
conv.i // Convert to (64-bit) native int
ldc.i4.m1 // Load int32 -1
add // Add native int 0 and int32 0xFFFFFFFF together
Vậy kết quả ở đây là gì? Lưu ý rằng, theo đặc điểm kỹ thuật, thời gian chạy không cần phải theo dõi các loại chính xác hoặc ký kết của các giá trị trên ngăn xếp: chỉ biết int32
, int64
và native int
(và một số khác không có liên quan ở đây).
Tôi tưởng tượng rằng IntPtr
và UIntPtr
số học, vì nó trong nội bộ được biểu diễn như ints bản xứ, sẽ cũng sử dụng loại này bổ sung. Tuy nhiên, ILSpy cho thấy thêm một số IntPtr
và Int32
trong C# gọi toán tử + bị quá tải trên lớp IntPtr
, chỉ chấp nhận đối số Int32
đã ký.
Thực hiện trực tiếp trong CIL (sử dụng hướng dẫn add
) cũng cho biết rằng số nguyên được hiểu là đã được ký. Nó cũng đã được thực hiện trong Mono, nhưng tôi không thể tìm thấy bất kỳ tài liệu tham khảo để trở lại những phát hiện của tôi lên.
Dấu hiệu cho giá trị được thăng hạng sẽ không bị phát hiện. Xem thông tin này để biết các giải pháp khả thi (dành cho Mac nhưng điều đó không quan trọng trong trường hợp này): https://developer.apple.com/library/mac/#documentation/Darwin/Conceptual/64bitPorting/MakingCode64-BitClean/MakingCode64- BitClean.html – K3N