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.