단순 자료구조 (1) - 정수 (Integer)

알고리즘

2020. 2. 18. 17:01

1. Bit, Byte

1) Bit는 컴퓨터에서 표현할 수 있는 단위 중 가장 작은 것으로 0 혹은 1의 값을 가질 수 있다.

2) Byte : 8개의 비트를 모아서 1바이트라고 한다. 

 

[그림] Byte 구조

 

Byte는 위와같이 구성된다. 8개의 비트가 모여져 있는 형태이고 최상단 비트(Most Significant Bit)는 MSB라고 하고, 최하단 비트 (Least Significant Bit)는 LSB라고 한다. 부호가 있는 자료형(Signed)자료형에서는 MSB는 부호를 나타내는 Sign Bit로 불리고, LSB는 짝수/홀수를 나타내는 비트로 불린다.

 

3) 부호 (Signed / Unsigned) : 부호가 있는 자료형(Signed)의 경우 $-2^{n-1}$ ~ $2^{n-1}-1$까지 표현가능하다. 그 이유는 우리가 부호가 있는 자료형을 사용할 때, 음수를 표현하기 위해 2의보수를 사용한다. 2의 보수를 사용하면 +0과 -0이 같아져서 하나의 음수를 더 표현할 수 있다. (1의 보수는 1111 1111, 0000 0000 모두 0이다) 때문에 만약 부호가 있는 1Byte를 표현한다고 하면 음수 128개(-128 ~ -1), 양수 128개(0 ~ 127)까지 가지게 되는 것이다. 

 

2. Word

하나의 기계어 명령어나 연산을 통해 처리할수 있는 기본단위를 의미한다. 첫번째로 CPU가 한번의 산술 및 논리 연산을 수행할 때 처리하는 데이터의 길이(레지스터 크기)가 워드이다. 두번째로 CPU가 한번의 버스 사이클을 통해 메모리나 IO장치에서 엑세스하는 데이터의 길이가 워드이다. 32비트 컴퓨터는 32비트의 워드를 가진다. 현재 프로세서가 한번에 엑세스하고 처리할 수 있는 양을 Full-Word라고하고, 그 절반을 Half-Word, 두배를 Double-Word, 4배를 Quad-Word라고 한다.

 

3. short, int, long

  • short (2Byte) : -32,768 ~ 32,767
  • int (4Byte) : -2,147,483,648 ~ 2,147,483,687
  • long (4Byte, C) : -2,147,483,648 ~ 2,147,483,687
  • long (8Byte, Java) : -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
  • long long (8Byte, C) : -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

 

일반적으로 C나 Java에서 사용하는 Integer의 자료형은 위와 같다. 정수의 범위에 따라 위와같이 범위가 나뉜다. 일반적으로 short는 32,000, Int는 21억, long (long long)은 923경까지 표현 가능하다. (C언어에서는 과거 16비트 프로세서 사용의 영향으로 int와 long모두 4Byte이다. 과거에 C에서 int는 2Byte였다.)

 

우리는 보통 int를 가장 많이 쓴다. 그 이유는 오랜기간동안 컴퓨터가 32Bit Word를 가졌기 때문이다. 때문에 어차피 한번에 엑세스하거나 처리할 수 있는 양의 최대치는 32bit였고 가장 효율적인 int를 많이 사용했다. (short를 써도 어차피 데이터버스를 통해 이동되고, 레지스터에 저장되는 데이터는 32bit이다)

 

short의 경우 2Byte의 범위를 가지는 것은 맞다. 그러나 32비트 시스템에서는 int와 short 모두 32비트 길이를 가지게 된다. - 참조 때문에, short은 크기때문이 아니라 범위의 제한을 둘 때 사용하는 것이 옳다. 어떤 시스템에서 32000을 넘어서는 안되는 시스템이 있다면 그럴 때 short을 사용해야한다. 그러나 이런것은 프로그램에 명시적인 조건문으로 제한을 두는 것이 좋기 때문에 우리는 더 이상 short을 사용하지 않는다.

 

우리가 만약 char나 short을 이용해 데이터를 표현했는데 자리수가 넘어가면 프로세서는 자동으로 0xFF와 AND연산을 수행하여 넘어서는 데이터를 잘라낸다. 이러한 과정에서 오히려 오버헤드가 발생할 수 있다. 2byte를 아끼고자 int 대신 short을 썼는데, RAM의 Text 영역에 저장되는 실행 코드가 4byte길어질 수 있다는 말이다. 이는 오히려 손해이다.

 

4. int_t

그렇다면 우리가 정말 작은 크기의 데이터를 사용하고 싶다면 어떻게 해야할까? C에서는 <stdint.h>를 include하고 int_t 타입을 사용할 수 있다. int8_t, int16_t, int32_t 등의 자료형은 실제로 해당 비트만 가지게 처리되어 버스를 통해 데이터가 많이 이동하더라도 실제로 메모리에 잡히는 영역은 작아져서 아주 작은 메모리를 가진 시스템을 구현할 때 용이하게 사용될 수 있다. (unsigned는 uint_t형을 사용, 아래코드는 단순 예시일 뿐임)

#include<stdio.h>
#include<stdint.h>

int main(){
	
	uint8_t i, j;
	
	for(i=0; i < 20 ; i++){
		for(j=0 ; j<=i ; j++){
			printf("*");
		}
		printf("\n");
	}
	
	return 0;
} 

 

5. BigDecimal

만약 우리가 923경을 넘어서는 숫자를 표현하려면 어떻게 해야할까? 바로 Big Decimal, Big Integer를 사용해야한다. Java의 경우 BigDecimal이나 BigInteger가 JDK에 구현되어 있기 때문에 편리하게 사용할 수 있다. 그러나 C언어의 경우 구조체나 배열을 통해 직접 구현해야한다. 만약 36Bit의 정수형데이터를 입력받으려면 struct{long long head(18bit), long long tail(18bit)}과 같은 방식으로 반절을 잘라서 구현하거나, char[36] 과 같이 배열을 이용하여 자리수마다 숫자를 받아서 구현할 수 있다.

 

6. Java Unsigned

Java는 제임스고슬링이 처음 만들 때 Unsigned는 필요가 없다고 여겨져서 언어에 Unsigned을 넣지 않았다. 때문에 기본키워드는 존재하지 않았으나 이후 Java가 업데이트 되면서 Integer와 같은 Wrapper클래스에서 parseUnsignedInt등을 지원하기 시작하면서 메소드를 통해 사용할 수 있게 되었다. 

 

7. Reference

 

When to use `short` over `int`?

There are many questions that asks for difference between the short and int integer types in C++, but practically, when do you choose short over int?

stackoverflow.com

 

32비트에서는 char, short 대신 int 형을 써야 연산속도가 줄어든다

written by 김시찬(chanywa), 2010-02-24 E-mail : chany@chanywa.com Homepage : http://chanywa.com 변수에 쓸 데이터형, 한번쯤은 고려해보자 C 프로그래머의 입장에서 이야기를 시작하는 것이긴 하지만, 어떤..

copynull.tistory.com