Часто большие числа становятся отрицательными

с тех пор, как я начал использовать eclipse для project euler, я заметил, что большие числа иногда становятся, казалось бы, случайными отрицательными числами. Я полагаю, это как-то связано с передачей Будри этого типа.

Я был бы рад, если бы вы могли объяснить мне, как эти отрицательные числа генерируются и какова логика за ним. Кроме того, как я могу избежать их (предпочтительно не с классом BigInteger). Данке!=)

4 ответов


Это изображение показывает, что вы ищете. В вашем случае это, очевидно, большие числа, но принцип остается прежним.

Примерами ограничений в java являются:
int: от -2,147,483,648 до 2,147,483,647.
длинные: -9,223,372,036,854,775,808 до 9,223,372,036,854,775,807


на изображении 0000, 0001 и т. д. показано двоичное представление чисел.

Image explaining two's complement

EDIT: в project euler вам часто приходится думать о способ обойти крупными цифрами. Проблемы разработаны с такими большими числами, что вы не можете использовать обычный способ решения проблем. Однако, если вы обнаружите, что вам действительно нужно использовать их, я предлагаю изучить BigInteger в любом случае. Вы найдете его полезным в долгосрочной перспективе, и это не так уж сложно. Вот ссылка с большим количеством понятных примеров: Пример BigInteger


здесь два!--5--> представление для 2-битного целого числа: (U означает Unsigned, S означает Signed)

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

арифметика выполняется в основном как в случае без знака, по модулю max (U) (4 в нашем случае).

логика одинакова для больших типов. int в Java 32 бит. Использовать long для 64 бит.


в математике числа бесконечны. Однако в компьютерах они не являются. Есть MAX_VALUE для каждого intтип: int, short, long. Например Integer.MAX_VALUE. При попытке увеличить число больше этого значения число становится отрицательным. Таким образом, внутреннее двоичное представление чисел работает.

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

вы, вероятно, переполнены размер типа данных, так как старший бит-это знаковый бит. Я не думаю, что Java имеет unsigned типы данных, поэтому вы можете попробовать использовать больший тип данных, такой как long Если вы хотите провести больше int. Если вы все еще переполнены long хотя, вы в значительной степени застряли с BigInteger.