[java] Java에서 서명되지 않은 int 선언

Java에서 서명되지 않은 int를 선언하는 방법이 있습니까?

또는 질문도 다음과 같이 구성 될 수 있습니다. 서명되지 않은 Java는 무엇입니까?

Java의 구현을보고있는 컨텍스트를 알려줍니다 String.hashcode(). 정수가 32 unsigned int이면 충돌 가능성을 테스트하고 싶었습니다.



답변

Java에는 부호없는 정수에 대한 데이터 유형이 없습니다 .

큰 값을 저장해야하는 경우 long대신 대신을 정의 할 수 있습니다 int.

부호없는 정수를 부호없는 것처럼 사용할 수도 있습니다. 2의 보수 표현의 이점은 부호있는 정수와 부호없는 정수에 대해 2 진 레벨에서 대부분의 연산 (더하기, 빼기, 곱하기 및 왼쪽 시프트와 같은)이 동일하다는 것입니다. 그러나 몇 가지 작업 (분할, 오른쪽 이동, 비교 및 ​​캐스팅)은 다릅니다. Java SE 8부터 Integer클래스의 새로운 메소드를 사용하면 int데이터 유형 완전히 사용하여 부호없는 산술을 수행 할 수 있습니다 .

Java SE 8 이상에서 int 데이터 유형을 사용하여 최소값 0과 최대 값 2 ^ 32-1을 갖는 부호없는 32 비트 정수를 나타낼 수 있습니다. 정수 클래스를 사용하여 int 데이터 유형을 부호없는 정수로 사용하십시오. 같은 정적 방법 compareUnsigned, divideUnsigned등은 부호없는 정수에 대한 산술 연산을 지원하는 정수 클래스에 추가되었다.

참고이 int선언되었지만 부호없는 산술에서 이러한 방법을 사용하여 현재 가능한 경우 변수가 여전히 서명 Integer클래스를.


답변


답변

int의 값이 부호 또는 부호 없는지 여부는 비트가 해석되는 방법에 따라 다릅니다. Java는 비트를 부호있는 값으로 해석합니다 (부호없는 프리미티브가 없음).

부호없는 값으로 해석하려는 정수가있는 경우 (예 : 부호없는 값이 들어있는 DataInputStream에서 정수를 읽는 경우) 다음 트릭을 수행 할 수 있습니다.

int fourBytesIJustRead = someObject.getInt();
long unsignedValue = fourBytesIJustRead & 0xffffffffl;

16 진 리터럴은 int 리터럴이 아닌 긴 리터럴이어야하므로 끝에 ‘l’이 있어야합니다.


답변

우리는 모델 부호 번호를 필요로 MySQL을의 부호 TINYINT, SMALLINT, INT, BIGINTjOOQ 우리가 만든 이유는, jOOU , 자바 부호없는 정수 숫자 유형의 래퍼 최소한의 라이브러리를 제공합니다. 예:

import static org.joou.Unsigned.*;

// and then...
UByte    b = ubyte(1);
UShort   s = ushort(1);
UInteger i = uint(1);
ULong    l = ulong(1);

이러한 모든 유형은 확장 java.lang.Number되어 고차 기본 유형 및로 변환 될 수 있습니다 BigInteger. 도움이 되었기를 바랍니다.

(면책 조항 : 나는이 라이브러리 뒤에있는 회사에서 일합니다)


답변

부호없는 숫자의 경우 Guava 라이브러리 에서 다음 클래스를 사용할 수 있습니다 .

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

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

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


답변

char16 비트 부호없는 정수에 사용하십시오 .


답변

아마도 이것이 당신이 의미 한 것입니까?

long getUnsigned(int signed) {
    return signed >= 0 ? signed : 2 * (long) Integer.MAX_VALUE + 2 + signed;
}
  • getUnsigned(0) → 0
  • getUnsigned(1) → 1
  • getUnsigned(Integer.MAX_VALUE) → 2147483647
  • getUnsigned(Integer.MIN_VALUE) → 2147483648
  • getUnsigned(Integer.MIN_VALUE + 1) → 2147483649