programing

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

goodcopy 2022. 7. 26. 22:48
반응형

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

Java에서 서명되지 않은 int를 선언하는 방법이 있나요?

또는 다음과 같은 질문을 할 수도 있습니다.unsigned의 Java는 무엇입니까?

Java의.String.hashcode()정수가 32의 부호 없는 int일 경우 충돌 가능성을 테스트하고 싶었습니다.

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

를 정의할 수 있습니다.int큰 값을 저장할 필요가 있는 경우.

부호 있는 정수를 부호 없는 정수로 사용할 수도 있습니다.2의 보완 표현의 이점은 대부분의 연산(더하기, 빼기, 곱하기, 왼쪽 이동 등)이 부호 있는 정수와 부호 없는 정수에 대해 이진 수준에서 동일하다는 것입니다.그러나 일부 작업(분할, 우측 이동, 비교 및 주조)은 다릅니다.Java SE 8에서는 클래스의 새로운 메서드를 사용하여int부호 없는 산술을 수행할 데이터 유형:

Java SE 8 이후에서는 int 데이터 유형을 사용하여 부호 없는 32비트 정수를 나타낼 수 있습니다.이 정수는 최소값이 0이고 최대값이 2^32-1입니다.Integer 클래스를 사용하여 int 데이터 유형을 부호 없는 정수로 사용합니다.부호 없는 정수의 산술 연산을 지원하기 위해 Integer 클래스에 등의 정적 메서드가 추가되었습니다.

:int, 이제 은 「서명되지 않은 산술」의 「되지 않은 산술」에서 할 수 되었습니다.Integer를 누릅니다

int의 값이 서명되었는지 또는 서명되지 않았는지 여부는 비트의 해석 방법에 따라 달라집니다.Java는 비트를 서명된 값으로 해석합니다(부호되지 않은 프리미티브는 없습니다).

를 int에서 ).DataInputStream부호 없는 값으로 해석해야 한다는 것을 알고 있습니다).그러면 다음 트릭을 실행할 수 있습니다.

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

16진수 리터럴은 int 리터럴이 아닌 긴 리터럴이어야 합니다.따라서 마지막에 'L'이 표시됩니다.

MySQL의되지 않은 MySQL을 되지 않은 했습니다.TINYINT,SMALLINT,INT,BIGINTjOOQ에서, 그래서 우리는 Java에서 부호 없는 정수 숫자에 대한 래퍼 유형을 제공하는 최소 라이브러리인 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

여기에는 좋은 답이 있지만 비트 연산에 대한 시연은 보이지 않습니다.Visser(현재 받아들여지고 있는 답변)가 말하는 것처럼 Java는 기본적으로 정수에 서명합니다(Java 8에는 부호 없는 정수가 있지만 저는 정수를 사용한 적이 없습니다.더 이상 떠들지 말고, 해보자...

RFC 868의 예

IO에 부호 없는 정수를 써야 하는 경우 어떻게 됩니까?예를 들어 RFC 868에 따라 시각을 출력하는 경우가 있습니다.이를 위해서는 1900년 1월 1일 오전 12시 이후 초수를 부호화하는 32비트 빅 엔디안 부호 없는 정수가 필요합니다.이건 어떻게 부호화할까요?

다음과 같이 부호 없는 32비트 정수를 만듭니다.

4바이트(32비트)의 바이트 배열을 선언합니다.

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

어레이가 초기화됩니다. Java에서 바이트 배열이 0으로 초기화됩니까? 참조하십시오.이제 어레이의 각 바이트에 빅 엔디안 순서대로 정보를 입력해야 합니다(대혼란을 방지하려면 리틀 엔디안).긴 시간(Java에서는 긴 정수의 길이가 64비트)이 포함되어 있다고 가정합니다.secondsSince1900(이것은 처음 32비트 값만 사용하고 Date는 1970년 1월 1일 12:00 A.M.을 참조하고 있습니다).그 후 논리 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비트 빅엔디안 정수와 동등하게 되었습니다.네, 긴 데이터형은 서명되어 있습니다만, secondsSince1900은 하위32비트만을 사용한다고 상정하고 있기 때문에 이 사실을 무시했습니다).에 2높은 비트(16진수 의 첫 두 는 모두됩니다.long 1 1 、 2 ^7 ( 16 수 2 ) 。

출처: Java Network Programming, 제4판.

값을 사용하기 전에 "논리 AND"를 수행하여 서명 문제를 해결할 수 있습니다.

「」의 값)byte[] header[0]0x86

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

★★★★★★★★★★★★★★★

Integer -122 = 134

이 코드를 만들었습니다. "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);
                    }

Math.abs(숫자) 함수를 사용할 수 있습니다.양수가 반환됩니다.

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

반응형