[자료구조]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)
Integers in Java (Primitive Type)
Java의 경우는 정수형으로 나타낼 수 있는 범위가 4가지로 한정됩니다.
또한, 위에서 언급한대로 기본 타입에서 unsigned는 존재하지 않습니다.
단, 굳이 사용할 경우 Java에서 제공하는 Wrapper Class 내의 함수(JAVASE 8 이상)를 이용해 값을 변환할 수 있습니다.
(참고: Javase8 Docs-Java.lang.Integer)
Java에서 Unsigned 형 integer를 사용하는 방법 [클릭]
출력 화면
-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는 다른 기본자료형 포스팅이 끝나는대로 상세히 설명하겠습니다.
감사합니다.
댓글남기기