Java эквивалент без знака long long? - PullRequest
102 голосов
/ 03 февраля 2009

В C ++ мне нравилось иметь доступ к 64-битному целому числу без знака через unsigned long long int или uint64_t. Теперь в Java длинные 64-битные, я знаю. Однако они подписаны.

Существует ли беззнаковый long (long) как примитив Java? Как мне это использовать?

Ответы [ 10 ]

130 голосов
/ 11 августа 2014

Начиная с Java 8, есть поддержка unsigned long (unsigned 64 bit). Как вы можете использовать это:

Long l1 = Long.parseUnsignedLong("17916881237904312345");

Чтобы напечатать его, вы не можете просто напечатать l1, но вы должны сначала:

String l1Str = Long.toUnsignedString(l1)

Тогда

System.out.println(l1Str);
55 голосов
/ 03 февраля 2009

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

12 голосов
/ 03 февраля 2009

Нет, нет. Вам придется использовать примитивный тип данных long и иметь дело с проблемами подписи, или использовать такой класс, как BigInteger.

7 голосов
/ 03 февраля 2009

Нет, нет. Дизайнеры Java заявляют, что им не нравятся неподписанные целые. Вместо этого используйте BigInteger . См. этот вопрос для деталей.

6 голосов
/ 17 ноября 2014

Java 8 предоставляет набор беззнаковых длинных операций, которые позволяют напрямую обрабатывать эти переменные Long как беззнаковые длинные, вот некоторые наиболее часто используемые:

И сложения, вычитания и умножения одинаковы для длинных со знаком и без знака.

4 голосов
/ 06 августа 2014

Для длинных без знака можно использовать UnsignedLong класс из Библиотека Guava :

Поддерживает различные операции:

  • плюс
  • минус
  • раз
  • мода
  • dividedBy

В данный момент, похоже, не хватает операторов сдвига байтов. Если вам это нужно, вы можете использовать BigInteger из Java.

4 голосов
/ 04 февраля 2009

В зависимости от операций, которые вы намереваетесь выполнить, результат может быть одинаковым, подписанным или неподписанным. Однако, если вы не используете тривиальные операции, вы в конечном итоге будете использовать BigInteger.

3 голосов
/ 03 февраля 2009

Java не имеет неподписанных типов. Как уже упоминалось, возьмите на себя накладные расходы BigInteger или используйте JNI для доступа к собственному коду.

1 голос
/ 08 декабря 2014

Пакет org.apache.axis.types имеет

Класс UnsignedLong.

для Maven:

<dependency>
    <groupId>org.apache.axis</groupId>
    <artifactId>axis</artifactId>
    <version>1.4</version>
</dependency>
0 голосов
/ 05 июня 2014

Похоже, в Java 8 некоторые методы добавлены к Long, чтобы рассматривать старый добрый [подписанный] как неподписанный. Похоже на обходной путь, но иногда может помочь.

...