2014-10-06 16 views
5

Trong ngữ cảnh không được chọn, hãy thêm một số vào một số nguyên có giá trị 2147483647 được đảm bảo để kết quả là -2147483648?Là C# /. NET đã ký hành vi tràn số nguyên được xác định?

Ví dụ, với đoạn mã sau

const int first = int.MaxValue; 
    int second = first; 

    if (second >= first) 
    { 
     Console.WriteLine("First check"); 
    } 

    second++; 

    if (second >= first) 
    { 
     Console.WriteLine("Second check"); 
    } 

Trong C++, nó sẽ là hoàn toàn hợp lệ cho cả hai "kiểm tra đầu tiên" và "kiểm tra thứ hai" được in, như tôi ưu hoa có thể tái sử dụng các kết quả của đầu tiên kiểm tra thứ hai.

Có đúng sự thật của C# không?

+0

bạn đã thử thêm 1 vào số và kiểm tra nó trong trình gỡ lỗi .. nó sẽ mang lại '-2147483648' – MethodMan

+0

khi nói đến .NET, thực sự chỉ có một trình biên dịch – Steve

+0

Điều kiện đầu tiên Nếu có nghĩa là True. Và thứ hai sẽ không in ra giao diện điều khiển 'Kiểm tra thứ hai' bởi vì nó trở thành Số nguyên âm như tôi đã nêu trong nhận xét đầu tiên của tôi .. vậy vấn đề thực tế bạn đang đối mặt với – MethodMan

Trả lời

7

Từ spec:

4.1.5 Integral loại

Các kiểm tra và các nhà khai thác không được kiểm soát và báo cáo được sử dụng để kiểm soát tràn kiểm tra không thể thiếu loại phép tính số học và chuyển đổi (§7.6. 12). Trong một ngữ cảnh được kiểm tra, một tràn tạo ra một lỗi biên dịch thời gian hoặc gây ra một System.OverflowException được ném ra. Trong một ngữ cảnh không được kiểm soát, các luồng tràn bị bỏ qua và bất kỳ bit thứ tự cao nào không phù hợp với loại đích đều bị loại bỏ.

Đó là mô tả duy nhất về hành vi mà tôi có thể tìm thấy, nhưng dường như là đủ. Vì vậy, có, thêm một đến Int32.MaxValue sẽ dẫn đến giá trị -1 sử dụng biểu diễn bổ sung của hai.

+2

Thông số kỹ thuật cũng nói rằng bổ sung của hai phải được sử dụng? Tôi không thấy điều đó trong §4.1.5. – svick

+3

@svick C# spec (5.0) nói 'int' được đặt tên là' System.Int32'. Thông số ECMA-335 (CLI) (phiên bản thứ 6) cho biết 'System.Int32' là loại thư viện lớp tương đương với cụm CIL' int32', được định nghĩa là "giá trị đã ký hai bổ sung 32 bit". Vì vậy, có, giả sử một trình biên dịch C# và CIL phù hợp, C# int phải là phần bổ sung của hai (câu chuyện tương tự cho 'int8',' int16' và 'int64'). – Bob

0

MSDN:

Đối với số học, đúc, hoặc hoạt động chuyển đổi để ném một OverflowException , hoạt động phải diễn ra trong một bối cảnh kiểm tra. Theo mặc định , hoạt động số học và tràn trong Visual Basic được kiểm tra ; trong C#, chúng không phải. Nếu hoạt động xảy ra trong ngữ cảnh không được chọn, kết quả sẽ bị cắt bớt bằng cách loại bỏ bất kỳ bit có thứ tự cao nào không phù hợp với loại đích.

+0

Nếu bạn đang trích dẫn từ một số trang web, bạn nên liên kết đến trang đó. – svick

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