Java-эквивалент unsigned long long?
-
21-08-2019 - |
Вопрос
В C++ мне нравилось иметь доступ к 64-битному беззнаковому целому числу через unsigned long long int
, или через uint64_t
.Я знаю, что в Java длинные длины составляют 64 бита.Однако они подписаны.
Есть ли беззнаковый длинный (длинный) доступный в качестве примитива Java?Как мне его использовать?
Решение
Я так не думаю.Я думаю, что если вы захотите выйти за пределы подписанной длинной позиции, БигИнтегер это единственный (из коробки) путь.
Другие советы
Начиная с Java 8, появилась поддержка unsigned long (64 бита без знака).Вы можете использовать его следующим образом:
Long l1 = Long.parseUnsignedLong("17916881237904312345");
Чтобы его распечатать, нельзя просто распечатать l1, а нужно сначала:
String l1Str = Long.toUnsignedString(l1)
Затем
System.out.println(l1Str);
Нет, нет.Вам придется использовать примитив long
тип данных и решить проблемы со знаком или использовать такой класс, как BigInteger
.
Нет, нет.Разработчики Java официально заявили, что им не нравятся беззнаковые целые числа.Использовать БигИнтегер вместо.Видеть этот вопрос для получения подробной информации.
Ява 8 предоставляет набор беззнаковых длинных операций, которые позволяют вам напрямую обрабатывать эти переменные Long как беззнаковые длинные, вот некоторые часто используемые:
- Нить toUnsignedString(длинный я)
- интервал сравнениеБеззнаковый(длинный x, длинный y)
- длинный разделитьБеззнаковый(длинный дивиденд, длинный делитель)
- длинный остаток без знака(длинный дивиденд, длинный делитель)
Сложение, вычитание и умножение одинаковы для длинных значений со знаком и без знака.
В зависимости от операций, которые вы собираетесь выполнить, результат будет практически одинаковым, знаковым или беззнаковым.Однако, если вы не используете тривиальные операции, вы в конечном итоге будете использовать BigInteger.
Для unsigned long вы можете использовать Беззнаковыйдлинный класс из Библиотека Гуавы:
Он поддерживает различные операции:
- плюс
- минус
- раз
- мод
- деленное на
Чего на данный момент не хватает, так это операторов сдвига байтов.Если они вам нужны, вы можете использовать BigInteger из Java.
В Java нет беззнаковых типов.Как уже упоминалось, устраните накладные расходы BigInteger или используйте JNI для доступа к собственному коду.
Пакет org.apache.axis.types имеет
Класс UnsignedLong.
для Мавена:
<dependency>
<groupId>org.apache.axis</groupId>
<artifactId>axis</artifactId>
<version>1.4</version>
</dependency>
Похоже на Java 8 добавлены некоторые методы Чтобы долго относиться к старому доброму [подписанному] как к неподписанному.Кажется, это обходной путь, но иногда может помочь.