unsigned long long에 해당하는 Java?


106

C ++에서는을 통해 unsigned long long int또는을 통해 64 비트 부호없는 정수에 액세스하는 것을 즐겼습니다 uint64_t. 이제 Java에서 long은 64 비트입니다. 그러나 그들은 서명되었습니다.

Java 기본 형식으로 사용할 수있는 unsigned long (long)이 있습니까? 어떻게 사용하나요?


4
참고 허용되는 답변은 Java 8 이상에서 구식입니다. 번호를 서명되지 않은 것으로 간주하도록 Java에 요청할 수있는 새로운 기능에 대해서는 Answer by GigaStore 를 참조하십시오 . 일상적인 사용은 아니지만 필요할 때 편리합니다.
Basil Bourque 2015 년

답변:


55

나는 그렇게 믿지 않는다. 서명 된 길이보다 더 크게하고 싶다면 BigInteger 가 유일한 방법 이라고 생각 합니다.


17
이 답변은 약간 구식입니다 (2009 년 게시 됨). Java 8 (2014 년 3 월 릴리스)부터 unsigned long이 지원됩니다. 아래에 답변으로 게시 한 예를 확인하십시오.
Amr

140

Java 8부터 unsigned long (unsigned 64 비트)이 지원됩니다. 사용 방법은 다음과 같습니다.

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

그것을 인쇄하려면 단순히 l1을 인쇄 할 수는 없지만 먼저 다음을 수행해야합니다.

String l1Str = Long.toUnsignedString(l1)

그때

System.out.println(l1Str);

@ j10, Long ul1 = Long.parseUnsignedLong(objScannerInstance.next("\\d+"));범위 검사가 없기 때문에 우아하지는 않지만 그렇지 않으면 부호있는 long의 범위를 초과 할 수있는 긴 숫자 입력을 가져올 수 있습니다. ( Scanner::next(...)패턴 객체 또는 문자열 패턴도 허용 할 수 있다는 사실을 활용합니다 .)
Spencer D

가 어렵다.
Alex78191


7

아니, 없습니다. Java 디자이너는 서명되지 않은 int를 좋아하지 않는다고 기록했습니다. 대신 BigInteger 를 사용하십시오 . 자세한 내용은 이 질문 을 참조하십시오.


22
나는 그가 한 일에 대해 고슬링을 존경하지만 서명되지 않은 int에 대한 그의 변호는 내가 들어 본 가장 멍청한 변명 중 하나라고 생각합니다. :-) 우리는 ... :-) 부호의 int보다 자바 waaaay를 더 남았습니다 일이있어
브라이언 Knoblauch

1
JavaPolis 2007의 Gosling은 서명되지 않은 int에 대해 혼란스럽게 작동하지 않는 예제를 제공했습니다. Josh Bloch는 서명 된 int에서도 작동하지 않는다고 지적했습니다. 임의 크기의 정수 ftw!
Tom Hawtin-tackline


2
@PP .: 적어도 하나가 래핑 동작을 정의했을 때 서명 된 유형과 서명되지 않은 유형 사이의 자유로운 상호 작용을 허용하는 합리적인 규칙을 정의하는 것이 가능하지 않다고 생각합니다. 된 갖는 부호없는 바이트 또는 부호 없음 short가 발생했을 말했다 제로 바이트 어쨌든 다른 유형과 상호 작용하지 않기 때문에 문제. 더 큰 문제는 래핑 동작이 실제로 유용 할 때 드문 경우 (해시 코드 계산과 같은)에 대해 별도의 래핑 형식을 갖는 것과는 달리 숫자 를 나타내는 데 사용되는 형식에 대해 래핑 동작을 정의 하는 것입니다.
supercat 2014

3
@PP .: 언어 디자이너가 대수 고리와 숫자를 구별하는 것의 중요성을 인식하기를 바랍니다 ( "wrapping integer"유형이 무엇인지). 모든 크기 숫자는 암시 적으로 모든 크기 링으로 변환되어야하지만 링은 함수 또는 명시적인 형식 변환을 통해 동일한 크기 숫자 로만 숫자로 변환되어야합니다 . 부호없는 유형이 일반적으로 대수 고리처럼 동작하지만 때로는 숫자로 동작하는 C의 동작은 아마도 모든 가능한 세계 중 최악 일 것입니다. 나는 고슬링이 그것을 피하고 싶어한다고 탓할 수는 없지만 그가 그렇게하는 데 완전히 잘못된 접근 방식을 취했지만.
supercat 2014

6

Java 8 은 해당 Long 변수를 unsigned Long으로 직접 처리 할 수있는 unsigned long 연산 집합을 제공합니다. 다음은 일반적으로 사용되는 몇 가지 변수입니다.

그리고 더하기, 빼기, 곱하기는 부호있는 long과 부호없는 long에 대해 동일합니다.


2
소스 코드를 간단히 살펴보면 이러한 방법에 대해 약간주의해야합니다. long이 실제로 음수이면 (즉, 서명 된 케이스와 차이가 있음) BigInteger 클래스가 사용됩니다. 이는 최대 8 개의 새로운 BigInteger가 할당된다는 것을 의미합니다. 이것은 상당히 많고 확실히 성능 저하입니다.
Toonijn

4

수행하려는 작업에 따라 결과는 거의 동일하거나 서명되거나 서명되지 않습니다. 그러나 사소한 작업을 사용하지 않는 한 BigInteger를 사용하게됩니다.


4

unsigned long의 경우 Guava 라이브러리의 UnsignedLong 클래스를 사용할 수 있습니다 .

다양한 작업을 지원합니다.

  • ...을 더한
  • 마이너스
  • 타임스
  • 모드
  • 로 나눈

현재 누락 된 것처럼 보이는 것은 바이트 시프트 연산자입니다. 필요한 경우 Java의 BigInteger를 사용할 수 있습니다.


3

Java에는 서명되지 않은 유형이 없습니다. 이미 언급했듯이 BigInteger의 오버 헤드를 발생 시키거나 JNI를 사용하여 원시 코드에 액세스하십시오.


15
char은 부호없는 16 비트 값입니다.)
Peter Lawrey

2

org.apache.axis.types 패키지에는

UnsignedLong 클래스.

maven의 경우 :

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.