Java 8 및 Java 9에서 서명되지 않은 정수를 사용하는 방법은 무엇입니까?
Oracle "Primitive data types" 페이지 에서 Java 8이 서명되지 않은 int 및 long에 대한 지원을 추가한다고 언급합니다.
int
: 기본적으로int
데이터 유형은 32 비트 부호있는 2의 보수 정수이며, 최소값은 −2 31 이고 최대 값은 2 31 −1입니다. Java SE 8 이상에서는int
데이터 유형을 사용하여 최소값이 0이고 최대 값이 2 32 -1 인 부호없는 32 비트 정수를 나타낼 수 있습니다 . 데이터 유형을 부호없는 정수로 사용하려면Integer
클래스를 사용 하십시오int
. 자세한 내용은 숫자 클래스 섹션을 참조하십시오. 같은 정적 방법compareUnsigned
,divideUnsigned
등이 첨가 된Integer
부호없는 정수에 대한 산술 연산을 지원하는 클래스.
long
:long
데이터 유형은 64 비트 2의 보수 정수입니다. 부호long
있는 값은 최소값 -2 63 이고 최대 값은 2 63 -1입니다. 자바 SE 8 이상에서는 사용할 수long
부호없는 64 비트 표현하는 데이터 타입long
0의 최소값과 (2)의 최대 값을 가지며, 64 -1. int에서 제공하는 것보다 더 넓은 값 범위가 필요한 경우이 데이터 유형을 사용하십시오.Long
클래스는 방법이 좋아 포함compareUnsigned
,divideUnsigned
서명에 대한 산술 연산을 지원하는 등long
.
그러나 부호없는 long 또는 정수를 선언 할 방법을 찾지 못했습니다. 예를 들어, 다음 코드는 범위 내에 있어야 할 때 "리터럴이 범위를 벗어났습니다"(물론 Java 8을 사용하고 있음)라는 컴파일러 오류 메시지를 표시합니다 (할당 된 값은 정확히 2 64 -1 임). :
public class Foo {
static long values = 18446744073709551615L;
public static void main(String[] args){
System.out.println(values);
}
}
그래서, unsigned int 또는 long을 선언하는 방법이 있습니까?
게시 한 문서 와이 블로그 게시물 에 따라 서명되지 않은 int / long과 서명 된 int / long 사이의 기본 요소를 선언 할 때 차이가 없습니다. "새로운 지원"은 Integer 및 Long 클래스 (예 : Integer.divideUnsigned)에 정적 메서드가 추가 된 것입니다 . 이러한 방법을 사용하지 않는 경우 2 ^ 63-1보다 긴 "unsigned"는 음수 값을 가진 평범한 오래된 long입니다.
간단히 훑어 보면 +/- 2 ^ 31-1 또는 long의 경우 +/- 2 ^ 63-1 범위를 벗어난 정수 상수를 선언하는 방법이없는 것 같습니다. 범위를 벗어난 양수 값에 해당하는 음수 값을 수동으로 계산해야합니다.
음, 심지어 자바 (8)에, long
그리고 int
아직 서명, 일부 방법은 그들이 서명되지 않은 것처럼 그들을 치료 . 그렇게 서명되지 않은 long
리터럴 을 작성 하려면 다음을 수행하십시오.
static long values = Long.parseUnsignedLong("18446744073709551615");
public static void main(String[] args) {
System.out.println(values); // -1
System.out.println(Long.toUnsignedString(values)); // 18446744073709551615
}
// Java 8
int vInt = Integer.parseUnsignedInt("4294967295");
System.out.println(vInt); // -1
String sInt = Integer.toUnsignedString(vInt);
System.out.println(sInt); // 4294967295
long vLong = Long.parseUnsignedLong("18446744073709551615");
System.out.println(vLong); // -1
String sLong = Long.toUnsignedString(vLong);
System.out.println(sLong); // 18446744073709551615
// Guava 18.0
int vIntGu = UnsignedInts.parseUnsignedInt(UnsignedInteger.MAX_VALUE.toString());
System.out.println(vIntGu); // -1
String sIntGu = UnsignedInts.toString(vIntGu);
System.out.println(sIntGu); // 4294967295
long vLongGu = UnsignedLongs.parseUnsignedLong("18446744073709551615");
System.out.println(vLongGu); // -1
String sLongGu = UnsignedLongs.toString(vLongGu);
System.out.println(sLongGu); // 18446744073709551615
/**
Integer - Max range
Signed: From −2,147,483,648 to 2,147,483,647, from −(2^31) to 2^31 – 1
Unsigned: From 0 to 4,294,967,295 which equals 2^32 − 1
Long - Max range
Signed: From −9,223,372,036,854,775,808 to 9,223,372,036,854,775,807, from −(2^63) to 2^63 − 1
Unsigned: From 0 to 18,446,744,073,709,551,615 which equals 2^64 – 1
*/
Java 8 또는 Java 9에서 unsigned long 또는 int 를 선언 하는 방법은 없습니다. 그러나 일부 메소드는이를 서명되지 않은 것처럼 처리합니다. 예를 들면 다음과 같습니다.
static long values = Long.parseUnsignedLong("123456789012345678");
그러나 이것은 변수의 선언 이 아닙니다 .
If using a third party library is an option, there is jOOU (a spin off library from jOOQ), which offers wrapper types for unsigned integer numbers in Java. That's not exactly the same thing as having primitive type (and thus byte code) support for unsigned types, but perhaps it's still good enough for your use-case.
import static org.joou.Unsigned.*;
// and then...
UByte b = ubyte(1);
UShort s = ushort(1);
UInteger i = uint(1);
ULong l = ulong(1);
All of these types extend java.lang.Number
and can be converted into higher-order primitive types and BigInteger
.
(Disclaimer: I work for the company behind these libraries)
참고URL : https://stackoverflow.com/questions/25556017/how-to-use-the-unsigned-integer-in-java-8-and-java-9
'Development Tip' 카테고리의 다른 글
판다의 데카르트 곱 (0) | 2020.10.11 |
---|---|
PowerMockito.whenNew () 사용이 조롱되지 않고 원래 메서드가 호출 됨 (0) | 2020.10.11 |
명령 줄 인터페이스로 Clojure 앱을 구축하고 계십니까? (0) | 2020.10.11 |
메서드의 소스 코드를 어떻게 동적으로 가져올 수 있으며이 메서드가 어떤 파일에 있는지 (0) | 2020.10.11 |
파이썬에서 디렉토리 트리 구조를 나열합니까? (0) | 2020.10.11 |