java unsigned
JAVA / 2012. 2. 9. 10:57
예를 들어, int에 들어 있는 -1 이라는 숫자를, unsigned형으로 표현하면 4294967295 가 되는데, 이런 변환 작업을 자바에서 하려면 아래 예제의 unsigned32() 라는 메소드(함수)를 사용하면 됩니다. 자바에서는 unsigned형으로 형변환(Typecasting)하는 캐스트 연산자가 제공되지는 않습니다. unsigned형 자체가 없기에...
자바의 int에는 2147483647 이상의 숫자를 넣을 수 없으므로, unsigned32()는, int가 아닌 long형으로 반환합니다. (물론 자바의 long형도 unsigned형은 없지만, 64비트 정수이기에 천문학적인 정수를 대입할 수 있습니다.)
자바의 int에는 2147483647 이상의 숫자를 넣을 수 없으므로, unsigned32()는, int가 아닌 long형으로 반환합니다. (물론 자바의 long형도 unsigned형은 없지만, 64비트 정수이기에 천문학적인 정수를 대입할 수 있습니다.)
public class Example {
public static void main(String[] args) {
System.out.println( unsigned32(-1) ); // 4294967295
System.out.println( unsigned32(-2) ); // 4294967294
System.out.println( unsigned32(1) ); // 1
System.out.println( unsigned32(0)); // 0
System.out.println( unsigned32(0xFFFFFFFF) ); // 4294967295 (부호 없는 32비트 int형의 최대값)
System.out.println( unsigned32(0x7FFFFFFF) ); // 2147483647 (부호 있는 32비트 int형의 최대값)
System.out.println( unsigned32(0x7FFFFFFF - 1) ); // 2147483646
System.out.println( unsigned32(0x7FFFFFFF + 1) ); // 2147483648
}
// int를, unsigned형 long으로 변환 메서드
public static long unsigned32(int n) {
return n & 0xFFFFFFFFL;
}
}
일단 JAVA가 C/C++의 unsigned 를 지원하지 않는건 맞구요,
그런 문제가 발생한다면 아래와 같은 식으로 해주시면 됩니다.
int val = myByte < 0 ? ( Byte.MAX_VALUE + 1 ) * 2 + myByte : myByte;
코드를 보시면 왜 저렇게 써야하는지는 이해를 할 수 있으리라 보네요.
log 의 경우에도 이런식으로 하시면 될것 같구요, 그리고 특별히
Byte, Integer, Long 등의 래퍼클래스의 MAX_VALUE나 MIN_VALUE를 넘지 않는 한은
특별히 신경쓸 이유도 없습니다.(당연하겠지만...)
저도 정확히는 알 수 없습니다만, 자바에서는 자체적으로 BigDecimal 등을 이용해서
C보다 더 큰 숫자를 표현할 수 있는 방법을 제공해 주기 때문에 굳이 C처럼
unsigned 를 지원할 필요가 없다고 생각한게 아닐까요? 라는 생각을 해봤습니다.
public static void main(String[] args) {
System.out.println( unsigned32(-1) ); // 4294967295
System.out.println( unsigned32(-2) ); // 4294967294
System.out.println( unsigned32(1) ); // 1
System.out.println( unsigned32(0)); // 0
System.out.println( unsigned32(0xFFFFFFFF) ); // 4294967295 (부호 없는 32비트 int형의 최대값)
System.out.println( unsigned32(0x7FFFFFFF) ); // 2147483647 (부호 있는 32비트 int형의 최대값)
System.out.println( unsigned32(0x7FFFFFFF - 1) ); // 2147483646
System.out.println( unsigned32(0x7FFFFFFF + 1) ); // 2147483648
}
// int를, unsigned형 long으로 변환 메서드
public static long unsigned32(int n) {
return n & 0xFFFFFFFFL;
}
}
일단 JAVA가 C/C++의 unsigned 를 지원하지 않는건 맞구요,
그런 문제가 발생한다면 아래와 같은 식으로 해주시면 됩니다.
int val = myByte < 0 ? ( Byte.MAX_VALUE + 1 ) * 2 + myByte : myByte;
코드를 보시면 왜 저렇게 써야하는지는 이해를 할 수 있으리라 보네요.
log 의 경우에도 이런식으로 하시면 될것 같구요, 그리고 특별히
Byte, Integer, Long 등의 래퍼클래스의 MAX_VALUE나 MIN_VALUE를 넘지 않는 한은
특별히 신경쓸 이유도 없습니다.(당연하겠지만...)
저도 정확히는 알 수 없습니다만, 자바에서는 자체적으로 BigDecimal 등을 이용해서
C보다 더 큰 숫자를 표현할 수 있는 방법을 제공해 주기 때문에 굳이 C처럼
unsigned 를 지원할 필요가 없다고 생각한게 아닐까요? 라는 생각을 해봤습니다.
'JAVA' 카테고리의 다른 글
웹로직의 DB 자원 회수(Inactive Connection Timeout) (0) | 2013.11.19 |
---|---|
JDK 다운 설치 (5) | 2012.02.16 |
세션이 생성되고 관리되는 과정 (3) | 2011.08.12 |
중복로그인 체크 (2) | 2011.08.12 |
java 형변환 모음 (1) | 2011.04.06 |