2012-04-15 14 views
12

Điều này giống như một câu hỏi ngu ngốc, nhưng dường như tôi không thấy câu trả lời. Tôi có một UInt64, đó là phải có một giá trị tối đa củaUInt64 và "Các hoạt động tràn vào lúc biên dịch ở chế độ được chọn"

UInt64.MaxValue 18446744073709551615 

Tuy nhiên, khi tôi cố gắng gán một số kích thước khiêm tốn, tôi nhận được lỗi tràn bộ này "Các hoạt động tràn tại thời gian biên dịch trong chế độ kiểm tra ". Nếu tôi bọc nó trong một khối "kiểm soát", sau đó nó biên dịch, và chạy như thể biến này là zero:

UInt64 value1 = 1073741824 * 8; // Compile error 
UInt64 value2 = 8589934592;  // Actual value - no error 

Tại sao happenning này ??

+0

Ahh có - điều đó hoàn toàn sẽ giải thích! Cảm ơn các bạn! –

Trả lời

23

Bởi vì:

UInt64 value1 = 1073741824 * 8; 

Là làm số học như một ký 32-bit số nguyên, sau đó chuyển đổi nó vào một ulong. Hãy thử:

UInt64 value1 = 1073741824UL * 8; 

UL có nghĩa là chữ có độ dài chưa ký. Xem phần 2.4.4 của C# Thông số kỹ thuật để biết thêm về hậu tố đen:

Nếu theo nghĩa đen là hậu tố bởi UL, Ul, UL, ul, LU, Lu, Lu, hoặc lu, nó là loại ulong

4

1073741824int, không phải là UInt64.
Do đó, phép nhân của bạn sẽ vượt quá giới hạn của số nguyên đã ký 32 bit.

Thêm hậu tố ul (chưa ký dài) vào toán hạng.

1

Bạn đã có một lỗi bởi vì bạn hoạt động với int thay vì long 1073741824 vẫn là int (tối đa cho int là 2147483647).
Vì vậy, trong trường hợp đầu tiên, bạn bị tràn loại int.
Thay đổi cụm từ đầu tiên bằng:

UInt64 value1 = 1073741824L * 8; 

và sự cố sẽ biến mất.

+0

không thông báo cho bạn hoạt động với giá trị chưa được ký. Đối với unsigned dài bạn nên sử dụng 1073741824UL thay vì 1073741824L. –