2010-11-03 5 views
6

Tôi đang bối rối!1000000000 * 3 = -1294967296?

Hôm nay là ngày 03 Tháng Mười Một

DateTime DateTime = new DateTime(2010,11,3); 
long shazbot = 1000000000 * DateTime.Day; 

shazbot đi ra để -1294967296

Huh ???

+0

Tôi chưa bao giờ sử dụng C# nhưng có vẻ như thời lượng của bạn dài 32 bit. Đã ký. Huh. –

+0

@Josh, trong C# 'longs' là [64 bit] (http://msdn.microsoft.com/en-us/library/ctetwysk%28VS.71%29.aspx) rộng. –

+0

Cố gắng nhân các cặp khác của Hệ thống :: Int32 và Hệ thống :: Int64. Tôi không phải là C# dev, chỉ quan tâm. – foret

Trả lời

41

shazbot có thể là một long, nhưng không phải 1000000000 hoặc DateTime.Day đang có. Vì vậy, C# hiện int phép nhân đầu tiên (dẫn đến tràn) sau đó chuyển nó thành một số long để lưu trữ trong shazbot.

Nếu bạn muốn có một kết quả long, làm cho một trong số họ một long, như thế này:

long shazbot = 1000000000L * DateTime.Day;

Edit: C# cung cấp cho bạn một cảnh báo nếu bạn sử dụng l thay vì L. Đã sửa.

+0

Làm cách nào để chuyển đổi giá trị của tôi thành dài? Convert.ToInt64? – sooprise

+1

Truyền? '(long) DateTime.Day' – AlexanderMP

+0

Tôi đã sử dụng thủ thuật" l "đó, làm việc như một sự quyến rũ. Cảm ơn! : D – sooprise

1

Cast để lâu như thế này:

long shazbot = 1000000000L * DateTime.Day; 
+1

Đủ để truyền một trong số đó thành 'long' để nhận biểu thức để đánh giá càng lâu. –

+0

Quá nhiều để viết. Có hoàn toàn không cần phải cast cả hai toán hạng. Một là đủ. Thứ hai sẽ được đúc hoàn toàn vào đúng loại. Hoặc, như R. Bemrose đề xuất, để viết một chữ dài thay vì chữ int mặc định, do đó, không có diễn viên sẽ cần thiết trong trường hợp này. – AlexanderMP

+0

Cảm ơn tôi sẽ thay đổi ví dụ của tôi. – jlafay