Programing

Java에서 서명되지 않은 int 선언

lottogame 2020. 3. 21. 10:12
반응형

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클래스를.


Java 8에는 서명되지 않은 Integer 및 Long에 대한 API 가 있습니다 !


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 비트 부호없는 정수에 사용하십시오 .


값을 사용하기 전에 "논리적 AND"를 수행하여 서명 문제를 처리 할 수있는 것 같습니다.

예 (의 값 byte[] header[0]0x86) :

System.out.println("Integer "+(int)header[0]+" = "+((int)header[0]&0xff));

결과:

Integer -122 = 134

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

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

이 코드를 작성하면 "this.altura"를 음수에서 양수로 변환합니다. 이것이 도움이 필요한 사람을 돕기를 바랍니다.

       if(this.altura < 0){    

                        String aux = Integer.toString(this.altura);
                        char aux2[] = aux.toCharArray();
                        aux = "";
                        for(int con = 1; con < aux2.length; con++){
                            aux += aux2[con];
                        }
                        this.altura = Integer.parseInt(aux);
                        System.out.println("New Value: " + this.altura);
                    }

여기에 좋은 대답이 있지만 비트 연산에 대한 데모는 보이지 않습니다. Visser (현재 허용되는 답변)와 같이 Java는 기본적으로 정수에 서명합니다 (Java 8에는 부호없는 정수가 있지만 사용하지는 않았습니다). 더 이상 고민하지 않고 해보자 ...

RFC 868 예

부호없는 정수를 IO에 작성해야하는 경우 어떻게됩니까? 실제 예는 RFC 868 에 따라 시간을 출력하려는 ​​경우 입니다. 여기에는 1900 년 1 월 1 일 오전 12시 이후의 초 수를 인코딩하는 부호없는 32 비트의 빅 엔디안 부호없는 정수가 필요합니다. 어떻게 인코딩 하시겠습니까?

다음과 같이 자신의 부호없는 32 비트 정수를 만드십시오.

4 바이트 (2 ^ 31 비트)의 바이트 배열 선언

Byte my32BitUnsignedInteger[] = new Byte[4] // represents the time (s)

이제 배열의 각 바이트를 빅 엔디안 순서로 정보를 채워야합니다 (혹은 혼란을 피하려면 리틀 엔디안). 시간이 포함 된 long (긴 정수는 Java에서 64 비트 길이)이라고 가정하고 secondsSince1900(첫 번째 32 비트 값만 사용하고 Date는 1970 AM 1 월 1 일 오전 12 시라는 사실을 처리했습니다.) 논리 AND를 사용하여 비트를 추출하고 해당 비트를 바이트로 강제 변환 될 때 무시되지 않는 위치 (숫자)로, 빅 엔디안 순서로 이동할 수 있습니다.

my32BitUnsignedInteger[0] = (byte) ((secondsSince1900 & 0x00000000FF000000L) >> 24); // first byte of array contains highest significant bits, then shift these extracted FF bits to first two positions in preparation for coersion to Byte (which only adopts the first 8 bits)
my32BitUnsignedInteger[1] = (byte) ((secondsSince1900 & 0x0000000000FF0000L) >> 16);
my32BitUnsignedInteger[2] = (byte) ((secondsSince1900 & 0x000000000000FF00L) >> 8);
my32BitUnsignedInteger[3] = (byte) ((secondsSince1900 & 0x00000000000000FFL); // no shift needed

우리 my32BitUnsignedInteger는 이제 RCF 868 표준을 준수하는 부호없는 32 비트, 빅 엔디안 정수와 같습니다. 예, long 데이터 유형은 부호가 있지만 secondsSince1900은 하위 32 비트 만 사용한다고 가정했기 때문에 그 사실을 무시했습니다. long을 바이트로 압축하기 때문에 2 ^ 7보다 높은 모든 비트 (16 진수의 첫 두 자리)는 무시됩니다.

소스 참조 : Java Network Programming, 4th Edition.


Math.abs (number) 함수를 사용할 수 있습니다. 양수를 반환합니다.

참고 URL : https://stackoverflow.com/questions/9854166/declaring-an-unsigned-int-in-java

반응형