본문 바로가기

프로그래밍./공통 내용

외부적 표현방식(비 수치적 표현방식), Pack, Unpack


자료의 표현
1. 내부적 표현 방식(수치적 표현 방식)
   1) 고정 소수점 방식
       - 부호와 절대치에 의한 방식
       - 1의 보수에 의한 방식
       - 2의 보수에 의한 방식
    2) 부동 소수점 방식

2. 외부적 표현방식(비수치적 표현 방식) : BCD, ASCII, EBCDIC 등


BCD - 숫자 0 ~ 9, 알파벳 26자. 총 36가지. 2진수로 표현하기 위해선 6비트 필요.

빨간 네모 박스를 zone 존 이라고 하며 그룹으로 구분하기 위해서 사용한다.

6비트 중 처음 2자리가 00 인 경우 숫자를 의미. 숫자는 똑같지만 문자의 경우
일반적으로 아는 것과 조금 다른 형식이다. A부터 차례로 1씩 증가 하는 것이 아니다.

10개씩 묶어서 분류를 하고 있다. 각 존에서 0000은 없고 0001부터 시작이다. 그래서 문자의 경우 9개씩이다.
01은 A 부터 9글자. 10은 J 부터 9글자, 11은 S부터 끝까지 이다.

A부터 차례로 쓰는게 당연히 쉽겠지만, 익숙해 지고 나면 위의 방법이 더 쉬울 것이다.
중간의 알파벳을 찾을 때 A부터 차례로 계산하지 않아도 된다는 편리성이 있다.
J부터 몇번째. 혹은 S부터 몇번째. 9글자이니 이진수를 표현하는 것은 어렵지 않을 것이다.

다만, BCD는 우리가 실제로 사용하지 않으니.. 그냥 그렇다고만 알아두자.



ASCII 7비트 사용. 128가지. 최대 128로 약속한 것이지 다 쓰는 것은 아님.

아스키 코드도 3비트를 zone으로 사용하는데 알파벳의 경우 대소문자가 따로 생겼고
결과적으로는 순차적으로 잡히게 되어있다. 위의 zone에서 표현되지 않은
000, 001, 010 등은 나머지 특수 문자들로 정해져 있다.



EBCDIC 8비트 사용  (대형 컴퓨터에서 사용) 과학이나 기타 등등에 대한 기호들이 많이 필요하므로.

4비를 zone으로 사용하고 16개는 조금 벅찬 감이 있어서 2자리씩 끈어서 따로 의미 부여를 하고
조합을 통해서 사용한다고 하나, 그냥 16개 각각으로 봐도 같다고 한다.


코드를 배우고 나면 한번 생각해야 할 문제가 있다.  우리가 흔히 1문자는 몇 바이트라고 하는가?
1byte 이다. 1byte란 8bit를 의미 하는데. 위에서 봤듯이 아스키 코드나 BCD는 6비트 또는 7비트로
한 문자를 표기한다. 그렇다면 왜 우리가 쓰는 아스키코드 위주로 7비트를 하지 않고 8비트로 하는 것일까?
또, 우리는 1byte 즉 8비트 단위이다. 이는 주기억장치의 단위이다.
실제적으로 보면 1문자를 받기 위해 주기억장치가 8비트를 준비하고
아스키 코드는 7bit 이다. 맨 앞에 1자리는 비게 되고 낭비가 되는 셈이다.

1byte를 7bit로 했다면 낭비도 없고 딱 맞게 떨어지고 좋을텐데 왜 8bit 인가?

의미적으로 원래의 의미를 따져 보자면. bit들이 모인 것을 bit string 이라고 하는데
그 중에서 8bit를 1byte 라고 하자. 라고 정의 한 것이다. 그럼, 왜 하필 8bit 였는가?

만약 우리가 7bit로 맞춰 놓았다면.. EBCDIC 에서 보내는 8bit를 받을 수 없기 때문이다.
8bit로 맞추고 7bit는 가능하지만 7bit로 맞춰 놓았다면 오버이기 때문이다. 그래서 8bit 이다.
만약, 8bit 이상 쓰는 코드가 나오고 널리 퍼져서 꼭 써야 한다면 이 정의 또한 바뀔 것이다.





"123" 과 123 의 차이를 아는가? 간단히 하자면 "123"은 문자열 로서 단순히 1과 2와 3이 붙은 문자열 이다.
123은 우리가 알고 있는 백이십삼의 의미를 갖는다. 우리가 123을 입력했다고 해보자. BCDIC 기준. 8bit.

                                                             1                   2                  3

1111은 숫자라면 있는 공통적인 부분이다. 모르겠다면 위에서 설명한 BCDIC를 다시 한번 확인하자.
그렇다면 이 1111을 제외하고 나머지 4자리만 따로 뽑아서 보면 어떻게 될까? 1, 2, 3 이 이진수로 된것을 알 수 있다.

게다가 4자리. 즉 0~9까지의 모든 수를 표현도 가능하다. 이렇게 본다면 10진수의 의미와 같다고 할까?
4자리를 1의 자리. 그 다음 4자리는 10의 자리. 그 다음은 100의 자리. 이런식으로 생각하고
해당하는 이진수 값을 계산한다면 (1*10^2) + (2*10^1) + (3*10^0 )
1,2,3 이 붙은게 아닌 123을 의미한다고 알 수 있다.

그럼 이제 컴퓨터는 그 123을 이진수로 바꾸어서 1111011을 뽑아낼 것이다.
이 부분은 회로도가 만들어져 있어서 값을 입력하면 이진수로 뿅~ 하고 나온다고 한다.

이렇게 해서 컴퓨터는 그냥 단순한 문자열 123과 숫자 123을 구분 할 수 있게 되었다.
단순한 문자열 즉, 1111과 함께 있는 값을 unpack 라고 하며, 그것을 숫자 1111011으로 바꾼 것을 pack 이라고 한다.
그러므로 당연히 pack, unpack 숫자에만 해당하게 된다.

"123" 이란 unpack 상태이고 컴퓨터에게 pack으로 전환하지 말라는 의미를 뜻한다.

 내부적 표현 방식 <-> 진법변환 <-> pack <-> unpack <-> 외부적 표현방식 같은 형태가 된다.



유용한 정보가 되셨다면 아래 손가락 버튼 한번 눌러주세요 ^-^