2009-02-03 8 views
95

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

Есть ли беззнаковый длинный (длинный) доступный как примитив Java? Как его использовать?

+3

** NOTE ** Принятый ответ устарел, как в Java 8 и более поздних. См. [Ответ на GigaStore] (http://stackoverflow.com/a/25248688/642706) для новой функции, где вы можете попросить Java рассматривать число как unsigned. Не для повседневного использования, но удобно, когда вам это нужно. –

ответ

51

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

+14

Этот ответ немного устарел (он был опубликован в 2009 году). Начиная Java 8 (выпущен в марте 2014 года), поддерживается поддержка unsigned long. Посмотрите пример, который я опубликовал ниже в качестве ответа. – Amr

7

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

+19

Я уважаю Гослинг за то, что он сделал, но я думаю, что его защита без подписи не является одним из самых тупых оправданий, которые я когда-либо слышал. :-) У нас есть waaaay более воинственные вещи в Java, чем unsigned ints ... :-) –

+0

Гослинг на JavaPolis 2007 привел пример, который смутно не работает для unsigned ints. Джош Блох отметил, что он тоже не работает для подписанных. Произвольные величины целых чисел ftw! –

+21

Я не уважаю Гослинг за то, что он сделал. Сказать, что люди не понимают неподписанную математику? Это подписанная математика, которая сложна, особенно на уровне бит. Я не понимаю, почему люди любят Java, когда это было четко написано для глупых людей (может быть, это самая тонкая шутка компьютерной науки?). –

12

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

3

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

+14

char - неподписанное 16-битное значение;) –

+6

ARGH! Тут ты меня подловил. Хорошо, мой друг – basszero

4

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

0

Похоже на Java 8 some methods are added Долгое время, чтобы лечить старые добрые [подписанные] длинные как неподписанные. Это похоже на обходное решение, но иногда может помочь.

4

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

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

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

То, что кажется отсутствующим на данный момент, это операторы сдвига байт. Если вам нужны те, которые вы можете использовать BigInteger с Java.

117

Запуск Java 8, поддержка unsigned long (без знака 64 бит).То, как вы можете использовать это:

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

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

String l1Str = Long.toUnsignedString(l1) 

Тогда

System.out.println(l1Str); 
+0

есть способ, которым мы могли бы читать unsigned long от сканера – j10

+0

@ j10, 'Long ul1 = Long.parseUnsignedLong (objScannerInstance.next (" \\ d + "));' Не совсем элегантный, потому что ему не хватает диапазона проверьте, но это позволит вам тянуть длинные числовые входы, которые в противном случае могли бы превышать диапазон подписанных длин. _ (Использует тот факт, что 'Scanner :: next (...)' также может принимать либо объект Pattern, либо шаблон String.) _ – SpencerD

6

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

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

+1

Быстрый взгляд в исходном коде говорит мне немного осторожно с этими методами. Когда долготы действительно отрицательные (т. Е. Есть отличие от подписанного случая), будет использоваться класс BigInteger. Это означает, что будет выделено до 8 новых BigIntegers, это довольно много и, безусловно, падение производительности. – Toonijn

1

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

.

для мавена:

<dependency> 
    <groupId>org.apache.axis</groupId> 
    <artifactId>axis</artifactId> 
    <version>1.4</version> 
</dependency>