2009-02-03 5 views
95

C++에서는 unsigned long long int을 통해 또는 uint64_t을 통해 64 비트 부호없는 정수에 액세스하는 것을 즐겼습니다. 자, Java long은 64 비트입니다. 그러나 그들은 서명되었습니다.Java의 unsigned long long과 동일합니까?

Java 프리미티브로 사용할 수있는 부호없는 long (long) 코드가 있습니까? 어떻게 사용합니까?

+3

** 참고 ** 허용 대답은 자바 (8) 이후로 오래된된다. Java에 번호를 서명되지 않은 것으로 간주하도록 요청할 수있는 새로운 기능에 대해서는 [GigaStore의 답변] (http://stackoverflow.com/a/25248688/642706)을 참조하십시오. 일상적인 사용이 아니라 필요할 때 편리합니다. –

답변

51

나는 그렇게 생각하지 않습니다. 일단 서명 된 길보다 더 크게 가고 싶다면, BigInteger이 (상자 밖으로) 유일한 방법이라고 생각합니다.

+14

이 답변은 조금 구식입니다 (2009 년 게시되었습니다). Java 8 (2014 년 3 월에 릴리스 됨)을 시작하면 부호없는 long이 지원됩니다. 아래에 답변으로 게시 한 예를 확인하십시오. – Amr

7

아니요, 없습니다. 자바 설계자들은 서명되지 않은 int를 좋아하지 않는다고 말하면서 기록에 남습니다. 대신 BigInteger을 사용하십시오. 자세한 내용은 this question을 참조하십시오.

+19

나는 Gosling이 그가 한 일에 대해 존경하지만, 나는 서명하지 않은 int에 대한 그의 변호가 내가 이제까지 들었던 가장 변덕스러운 변명 중 하나라고 생각한다. :-) 우리는 unsigned ints보다 Java에서 워키가 더 우스꽝 스럽다. :-) –

+0

JavaPolis 2007에서의 Gosling은 부호없는 int에서는 혼란스럽게 작동하지 않는다는 예를 보여 주었다. 조쉬 블로치 (Josh Bloch)는 서명 된 int에도 작동하지 않는다고 지적했습니다. 임의의 크기의 정수 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

는 당신이 Guava library에서 UnsignedLong 클래스를 사용할 수 있습니다 :

그것은 다양한 작업을 지원합니다

  • 플러스
  • 마이너스
  • 모드
  • dividedBy

현재 누락 된 것으로 보이는 것은 바이트 시프트 연산자입니다. 자바가 필요하면 BigInteger를 사용할 수 있습니다.

117

Java 8을 시작하면 부호없는 long (부호없는 64 비트)이 지원됩니다.

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

는 단순히 L1을 인쇄 할 수 없습니다, 그것을 인쇄하려면,하지만 당신은에 첫째 있습니다 : 당신이 그것을 사용할 수있는 방법은

String l1Str = Long.toUnsignedString(l1) 

을 다음

System.out.println(l1Str); 
+0

은 스캐너 – j10

+0

@ j10에서 부호없는 long을 읽을 수있는 방법이있다. 'Long ul1 = Long.parseUnsignedLong (objScannerInstance.next ("\\ d +")); 범위가 없기 때문에 정확하지는 않다. 확인하지만 긴 숫자 입력을 허용 할 수는 있지만 그렇지 않은 경우 서명 된 long의 범위를 초과 할 수 있습니다. _ ('Scanner :: next (...)'도 Pattern 객체 나 String 패턴 중 하나를 사용할 수 있다는 사실을 이용하십시오.) _ – SpencerD

6

Java 8가 제공 Long 변수를 unsigned Long으로 직접 처리 할 수있는 부호없는 long 연산 집합 Long, 여기에 일반적으로 사용되는 몇 가지 예가 있습니다 :

,210

덧셈, 빼기 및 곱셈은 signed 및 unsigned long에 대해 동일합니다.

+1

소스 코드를 빠르게 살펴보면이 메소드들에 대해 조금 신중할 것입니다. long가 실제로 음수 인 경우 (즉, 서명 된 사례와 다른 경우) BigInteger 클래스가 사용됩니다. 이것은 최대 8 개의 새로운 BigInteger가 할당된다는 것을 의미합니다. 이것은 상당히 많고 확실히 성능 저하입니다. – Toonijn

1

org.apache.axis.types 패키지는

UnsignedLong 클래스가 있습니다. 받는다는에 대한

:

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