Часто большие числа становятся отрицательными
с тех пор, как я начал использовать 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 и т. д. показано двоичное представление чисел.
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
.