2009-05-06 33 views
7

Tôi đang chứng kiến ​​một hành vi kỳ lạ trong một chương trình .net:Tại sao Intnet của tôi hoạt động như Int32?

Console.WriteLine(Int64.MaxValue.ToString()); 
// displays 9223372036854775807, which is 2^63-1, as expected 

Int64 a = 256*256*256*127; // ok 

Int64 a = 256*256*256*128; // compile time error : 
//"The operation overflows at compile time in checked mode" 
// If i do this at runtime, I get some negative values, so the overflow indeed happens. 

Tại sao cư xử Int64 tôi như thể chúng là Int32, mặc dù Int64.MaxValue dường như để xác nhận họ đang sử dụng 64 bit?

Nếu nó có liên quan, tôi đang sử dụng một hệ điều hành 32 bit, và nền tảng mục tiêu được đặt thành "Bất kỳ CPU"

Trả lời

20

RHS của bạn chỉ được sử dụng Int32 giá trị, vì vậy toàn bộ hoạt động được thực hiện bằng Int32 số học, sau đó kết quả là Int32 được quảng bá dài.

Thay đổi nó như thế này:

Int64 a = 256*256*256*128L; 

và tất cả sẽ tốt.

+1

Đặng bạn Jon Skeet! Bạn đánh bại tôi khoảng 10 giây! :) –

+0

Tôi cảm thấy ngu ngốc :) Cảm ơn! – Brann

+0

Bạn không ngu ngốc, ban đầu nó hơi khó hiểu một chút. Lúc đó tôi đã bị cắn khi tôi mong đợi rằng "double res = someInt/otherInt" thực hiện một phân chia điểm trôi nổi (mà nó không) và biết rằng phía bên tay trái không quan trọng. –

4

Sử dụng:

Int64 a = 256L*256L*256L*128L; 

L hậu tố có nghĩa là Int64 đen, không có hậu tố có nghĩa là Int32.

gì bạn đã viết:

Int64 a = 256*256*256*128 

có nghĩa là:

Int64 a = (Int32)256*(Int32)256*(Int32)256*(Int32)128; 
+0

hậu tố vốn 'L' được khuyến nghị vì nó dễ dàng nhận ra hơn, và trong một số phông chữ bạn thậm chí không thể phân biệt' 1' và 'l' –

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