[자료구조]1.2 Primitive Type: Integer (2) 범위와 명칭

Intro

지난 포스팅에서는 컴퓨터가 어떻게 정수를 처리하는지에 대해,
특히 음수를 처리하는 방법에 대해 알아보았습니다.
이번 포스팅에서는 정수형의 범위와 표현 가능한 크기를 함께 알아보겠습니다.

signed 와 unsigned?
이전 포스팅에서 다루었듯이 MSB(최상위 부호 비트)를 부호비트로 사용할 경우
이를 signed라고 하고, 기본 데이터형이 signed에 속한다고 하였습니다.
unsigned는 말 그대로 signed가 아니므로, MSB까지 데이터를 나타내는 비트로 사용합니다.
단, unsigned 데이터형에서는 음수를 구분할 방법이 없으므로,
signed에서 표현한 음수 범위만큼 양수 표현 범위가 늘어나게 됩니다.

주의! Java에서는 primitive type에서 unsigned 개념이 존재하지 않음.

Description

정수형의 범위는 언어별로 약간의 차이가 있습니다.
C, C++, Java의 경우를 살펴보겠습니다.

Integers in C language (& C++ language)

C언어와 C++언어에서 정수형으로 나타낼 수 있는 범위와 명칭은 거의 같습니다.
(참고: cppreference-fundamental-type)
datastructure_06

Integers in Java (Primitive Type)

Java의 경우는 정수형으로 나타낼 수 있는 범위가 4가지로 한정됩니다.
또한, 위에서 언급한대로 기본 타입에서 unsigned는 존재하지 않습니다.
단, 굳이 사용할 경우 Java에서 제공하는 Wrapper Class 내의 함수(JAVASE 8 이상)를 이용해 값을 변환할 수 있습니다.
(참고: Javase8 Docs-Java.lang.Integer)

datastructure_07

Java에서 Unsigned 형 integer를 사용하는 방법 [클릭]

  import java.lang.*;

public class unsigned_integer_test {

	public static void main(String[] args) {

		byte leastByte = Byte.MIN_VALUE;
		System.out.println(leastByte);
		System.out.println(Byte.toUnsignedInt(leastByte));

		short leastShort = Short.MIN_VALUE;
		System.out.println(leastShort);
		System.out.println(Short.toUnsignedInt(leastShort));

		int leastInt = Integer.MIN_VALUE;
		System.out.println(leastInt);
		System.out.println(Integer.toUnsignedLong(leastInt));

		long leastLong = Long.MIN_VALUE;
		System.out.println(leastLong);
		System.out.println(Long.toUnsignedString(leastLong));
	}

}
  

출력 화면

-128
128
-32768
32768
-2147483648
2147483648
-9223372036854775808
9223372036854775808

toUnsigned~ 함수로 Unsigned type이 만들어지는 건가요?

아닙니다.
Unsigned type을 따로 만들어 주는 것이 아니라, 해당 데이터형보다 더 넓은 범위의 데이터형으로 바꾸어주는 함수입니다.
엄밀히 말하면 형변환을 시켜주는 함수라고 볼 수 있습니다.
byte → toUnsignedInt() → int
short → toUnsignedInt() → int
int → toUnsignedLong() → Long
long → toUnsignedString() → String
단, 맨마지막의 toUnsignedString()함수를 통해 변환된 값은 정수형이 아닌 String type이므로 primitive type이 아닙니다.
(참고: Javase8 Docs:Byte)

Summary

이번 포스팅에서는 정수형이 표현할 수 있는 범위와, 그 명칭에 대해서 살펴보았습니다.
하지만, 안타깝게도 이 기본형이 무조건 적용되는 것은 아닙니다.

C언어와 C++언어에서는 사용자의 PC의 CPU의 bit수에 따라 범위가 달라질 수 있습니다.
또한, 특정 라이브러리를 통해 데이터형의 byte수를 조정하여
기본 데이터형에서 수용할수 있는 범위를 넓히거나 좁힐 수 있습니다.
(참고: cppreference-fundamental-type)

이 외에도 많은 프로그래밍 언어에서 정수형을 범위에 따라 다루고 있습니다.

Swift - (참고: Swift Docs org)
C# - (참고: Microsoft C# .NET Docs)

단, python 버전 3 이상부터는 순수 int는 범위 변경이 다소 자유로운 편입니다.
Python 3.x - (참고: Python Docs org)

범위와 연결된 overflow는 다른 기본자료형 포스팅이 끝나는대로 상세히 설명하겠습니다.

감사합니다.

댓글남기기