2013-06-20 29 views
7

Vì tôi bắt đầu sử dụng nhật thực cho dự án euler, tôi nhận thấy rằng số lượng lớn đôi khi trở thành một số âm dường như ngẫu nhiên. Tôi cho rằng điều này có liên quan đến việc vượt qua sự boudry của loại đó.Các số lớn thường trở thành tiêu cực

Tôi sẽ rất vui nếu bạn có thể giải thích cho tôi cách các số âm này được tạo ra và logic đằng sau nó là gì. Ngoài ra, làm thế nào tôi có thể tránh chúng (thích hợp hơn không với lớp BigInteger). Danke! =)

+0

Tôi đoán "sử dụng nhật thực" có nghĩa là "đang sử dụng java". Tôi hy vọng bạn biết nhật thực không liên quan gì đến vấn đề của bạn – Elazar

+0

Eclipse chỉ là một IDE. Điều này có nghĩa nó chỉ là một nơi bạn chỉnh sửa, biên dịch và chạy mã của bạn. Có thể bạn đang viết mã bằng Java. –

+1

tránh phụ thuộc vào vấn đề cụ thể của bạn. đôi khi bạn không thể tránh sử dụng 'Biginteger', đôi khi bạn có thể. – Elazar

Trả lời

10

Hình ảnh này hiển thị những gì bạn đang tìm kiếm. Trong trường hợp của bạn, nó rõ ràng là số lớn hơn, nhưng nguyên tắc vẫn như cũ.

Ví dụ về các giới hạn trong java là:
int: −2,147,483,648 đến 2,147,483,647.
dài: -9.223.372.036.854.775.808 đến 9.223.372.036.854.775.807


Trong hình 0000, 0001 vv, cho thấy sự biểu diễn nhị phân của số.

Image explaining two's complement

EDIT: Trong Euler dự án bạn thường phải nghĩ ra một cách để làm việc xung quanh những con số lagre. Các vấn đề được thiết kế với số lượng lớn để bạn không thể sử dụng cách giải quyết vấn đề thông thường. Tuy nhiên, nếu bạn thấy rằng bạn thực sự cần phải sử dụng chúng, tôi đề nghị nghiên cứu BigInteger anyway. Bạn sẽ thấy nó hữu ích trong thời gian dài, và nó không phải là tất cả những gì phức tạp. Đây là liên kết có nhiều ví dụ dễ hiểu: BigInteger Example

1

Trong số toán học là vô hạn. Tuy nhiên trong máy tính thì không. Có MAX_VALUE cho mỗi int loại tương tự: int, short, long. Ví dụ: Integer.MAX_VALUE. Khi bạn cố gắng tăng số nhiều hơn giá trị này, số sẽ trở thành số âm. Bằng cách này, biểu diễn nhị phân bên trong của các số làm việc.

int i = Integer.MAX_VALUE; 
i++; // i becomes negative. 
+1

Cụ thể hơn, nó trở thành 'Integer.MIN_VALUE'. –

+0

Chỉ cần để tôi xác minh điều này - số tiếp theo sau max_value là -1? (Ý tôi là (int) 2^31 + 1 = -1? – user2435678

+0

Không, giá trị tiếp theo sau 'Integer.MAX_VALUE' là' Integer.MIN_VALUE' như được đề cập bởi @Boris the Spider – AlexR

1

Có thể bạn đang làm tràn kích thước của loại dữ liệu, vì bit quan trọng nhất là bit dấu. Tôi không nghĩ rằng Java có các loại dữ liệu unsigned, do đó bạn có thể thử sử dụng loại dữ liệu lớn hơn chẳng hạn như long nếu bạn muốn giữ số lớn hơn int. Tuy nhiên, nếu bạn vẫn đang tràn ngập long, bạn sẽ bị kẹt với số BigInteger.

1

Dưới đây là một đại diện two's complement cho 2-bit số nguyên: (U nghĩa Unsigned, S có nghĩa là Signed)

U | bits | S 
--------------- 
0 | 00 | 0 
1 | 01 | 1 \ overflow here: 
2 | 10 | -2/ 1 + 1 = -2 
3 | 11 | -1 

số học được thực hiện chủ yếu như trong trường hợp unsigned, modulo max (U) (4 trong trường hợp của chúng tôi).

Logic là giống nhau đối với các loại lớn hơn. int trong Java là 32 bit. Sử dụng long cho 64 bit.

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