Java-еквівалент непідписаного довго-довго?


106

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

Чи є безпідписаний довгий (довгий) доступ як Java-примітив? Як я ним користуюся?


4
ПРИМІТКА Прийнята відповідь застаріла, як у Java 8 і пізніших версій. Дивіться відповідь від GigaStore щодо нової функції, де ви можете попросити Яву вважати номер непідписаним. Не для щоденного використання, але зручна, коли вам це потрібно.
Василь Бурк

Відповіді:


55

Я не вірю в це. Після того, як ви хочете подолати більше, ніж підписали, я думаю, що BigInteger - це єдиний (нестандартний) шлях.


17
Ця відповідь трохи застаріла (вона була розміщена у 2009 році). Починаючи з Java 8 (вийшов у березні 2014 року), існує підтримка непідписаних довгих. Перевірте приклад, який я розмістив нижче як відповідь.
Amr

140

Запускаючи Java 8, є підтримка непідписаних довгих (64-бітні без підпису). Спосіб його використання:

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

Щоб надрукувати його, ви не можете просто надрукувати l1, але спочатку потрібно:

String l1Str = Long.toUnsignedString(l1)

Тоді

System.out.println(l1Str);

@ j10, Long ul1 = Long.parseUnsignedLong(objScannerInstance.next("\\d+"));Не зовсім елегантний, тому що йому не вистачає перевірки діапазону, але це дозволить вам затягувати довгі цифрові входи, які в іншому випадку могли б перевищити діапазон підписаних довгих. (Використовує той факт, що Scanner::next(...)також можна прийняти або об'єкт Pattern, або String pattern.)
Спенсер D

важко.
Alex78191

12

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


7

Ні, немає. Дизайнери Java записують, що їм не сподобалися неподписані вставки. Замість цього використовуйте BigInteger . Детальніше див. У цьому питанні .


22
Я поважаю Гослінга за те, що він зробив, але вважаю, що його захист від безпідписаних інт є одним з найглуміших виправдань, які я коли-небудь чув. :-) У нас на Яві є більше химерних речей, ніж без підписаних ints ... :-)
Brian Knoblauch

1
Gosling на JavaPolis 2007 наводив приклад, що заплутано не працює для непідписаних вкладишів. Джош Блох зазначив, що він також не працює для підписаних текстів. Довільні розміри цілих чисел ftw!
Том Хотін - тайклін


2
@PP: Я не думаю, що можна визначити розумні правила, які дозволяють вільну взаємодію між підписаними та неподписаними типами, коли принаймні один з них визначає поводжувальну поведінку. Зважаючи на це, непідписаний байт або непідписаний короткий виклик би викликали нульову проблему, оскільки байти так чи інакше не взаємодіють з іншими типами. Більшою проблемою є визначення поведінки для обгортання для типів, які використовуються для представлення чисел , на відміну від наявності окремих типів загортання для тих рідкісних випадків (наприклад, обчислення хеш-коду), коли поведінка загортання насправді корисна.
supercat

3
@PP. Я б хотів, щоб мовні дизайнери визнали важливість розрізнення чисел від алгебраїчних кілець (що таке "цілочисельні цілі"). Будь-яке розмірне число повинно неявно перетворюватися в будь-яке розмірне кільце, але кільця повинні перетворюватися в номери лише за допомогою функції або за допомогою явного набору тексту в той самий номер розміру . Поведінка С, де неподписані типи зазвичай поводяться як алгебраїчні кільця, але іноді поводяться як числа, мабуть, найгірші з усіх можливих світів; Я не можу винуватити Гослінга в тому, що він хотів цього уникнути, хоча він скористався неправильним підходом до цього.
supercat

6

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

І додавання, віднімання, і множення є однаковими для підписаних і неподписаних довжин.


2
Швидкий погляд на вихідний код підказує мені бути обережними з цими методами. Коли довги дійсно негативні (тобто є відмінність від підписаного випадку), буде використовуватися клас BigInteger. Це означає, що буде виділено до 8 нових BigIntegers, це досить багато і, безумовно, падіння продуктивності.
Toonijn

4

Залежно від операцій, які ви збираєтесь виконати, результат майже однаковий, підписаний або непідписаний. Однак, якщо ви не використовуєте тривіальні операції, ви в кінцевому підсумку використовуєте BigInteger.


4

Тривалий час без підпису можна використовувати клас UnsignedLong з бібліотеки Guava :

Він підтримує різні операції:

  • плюс
  • мінус
  • разів
  • мод
  • ділиться на

На сьогоднішній день, здається, бракує операторів зміни байтів. Якщо вам потрібні такі, ви можете використовувати BigInteger від Java.


3

У Java немає непідписаних типів. Як уже згадувалося, підстрахуйте накладні витрати BigInteger або використовуйте JNI для доступу до рідного коду.


15
char - це непідписане 16-бітове значення;)
Пітер Лорі

2

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

Клас без підпису.

для maven:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.