이번 글에서는 컴퓨터가 데이터를 표현하는 방식에 대하여 알아 보겠습니다.
1. 컴퓨터가 데이터를 표현하는 방식
컴퓨터는 2진수를 기반으로 데이터를 표현하고 연산도 진행합니다.
2진수 뿐만 아니라 10진수, 8진수, 16진수등 N진수 형식으로 데이터를 표현 합니다.
(물론 실제로는 2진수 (0 과 1) 로 모든 것을 처리 합니다 !)
- 2진수 : 두 개의 기호(1, 0)를 이용해서 값(데이터)을 표현하는 방식입니다.
- 10진수 : 열 개의 기호(0~9)를 이용해서 값(데이터)을 표현하는 방식입니다.
- 8진수 : 여덟 개의 기호(0~7)를 이용해서 값(데이터)을 표현하는 방식입니다.
- 16진수 : 열 여섯 개의 기호(0~9, A~F)를 이용해서 값(데이터)을 표현하는 방식입니다.
- N진수 : N개의 기호를 이용해서 값(데이터)을 표현하는 방식입니다.
2. 데이터의 표현단위인 비트(Bit)와 바이트(Byte)
1 Bit = 0 또는 1이라는 정보 '하나'를 저장 할 수 있는 저장공간을 의미합니다. 또한 컴퓨터의 데이터 처리 단위의 최소 단위 이기도 합니다.
1 Byte = 8개의 Bits ( 8 bits )로 이루어져 있는데, 1 Byte를 언급한 이유는 프로그램에서 의미 있는 데이터를 표현하는데 있어서 가장 기본이 되는 단위가 Byte이기 때문입니다.
3. 정수와 실수의 표현 방식
1) 정수의 표현 방식
- 1 Byte를 기준으로 가장 왼쪽의 1 bit가 부호를 나타내는 비트(부호비트) 입니다.
- ex) 1 0 0 0 0 0 0 1 -> 가장 왼쪽의 1 bit가 1일 경우 음수, 0일 경우 양수를 나타냅니다.
- 부호비트를 제외한 나머지 비트는 크기를 나타내는데 사용됩니다.
- 음의 정수를 표현 할 때는 2의 보수를 취합니다.
- 음의 정수를 표현 할 경우 부호비트만 바꾸면 음수라는 실수를 할 수 있게 되는데 이는 간단 예제로 확인 해 보겠습니다.
수학으로 생각해 보겠습니다. 5 - 5 = 0 이 되어야 하는데 컴퓨터의 연산에서는 위의 예제와 같이 할 경우 0이 아니게 되므로 컴퓨터 에서의 음의 정수 표현 방식에 문제가 있다는 것을 알 수 있습니다. 따라서 컴퓨터가 인식하는 음의 정수는 2의 보수 입니다.
2의 보수를 구하는 것은 쉽게 생각하면 됩니다.
해당 값들의 비트 값을 0은 1로, 1은 0으로 반전시켜서 써주면 1의 보수가 됩니다.
이 때 1의 보수에서 +1 을 해주게 되면 2의 보수가 나오게 됩니다.
ex) 0 0 0 0 0 0 1 1 << 3
+ 1 1 1 1 1 1 0 1 << 2의 보수
-------------------------
0 0 0 0 0 0 0 0 << 결과가 0이 되므로 예제에서의 2의 보수는 -3이 되는 것을 확인 할 수 있습니다.
* 이 때 1이 가장 왼쪽에 있어야 되지 않나?? 9자리가 되지 않나?? 하는 생각을 할 수 있는데, 컴퓨터 연산의 경우 1 Byte + 1 Byte = 1 Byte가 되어야 합니다. 따라서 1 Byte를 넘어서는 값인 1은 버려지는 값이 됩니다. 따라서 남은 값들이 0이 되어서 컴퓨터가 인식하는 음의 정수는 2의 보수 인 것을 알 수 있습니다.
2) 실수의 표현 방식
- 실수의 표현 방식은 아주 정확하고 깊게 이해 하려는 것이 아닌 컴퓨터의 실수 표현 방식은 정확히 표현을 할 수 없고, 오차가 존재 한다는 것만 알고 가도록 하겠습니다.
ex) 다음은 컴퓨터의 실수 표현의 오차로 인한 오차 누적의 결과로 발생한 실수 표현 방식을 나타낸 결과 입니다.
* 이론적으로 오차 없이 모든 실수를 완벽하게 표현할 능력이 있는 컴퓨팅 환경은 존재하지 않습니다.
4. 비트 연산자
다음으로 비트 연산자에 대하여 알아 보겠습니다.
* 비트 연산자의 경우 앞 쪽의 연산자 부분에서 조금 더 자세히 다루지 않고 데이터 표현 방식에서 다루는 이유는 데이터 표현 방식이 비트 단위 2진수 기반으로 처리가 되기 때문에 이러한 '비트'를 직접적으로 연산하는 비트 연산자를 이번 글에서 다루게 되었습니다.
다음은 비트 연산자의 종류와 기능입니다.
연산자 |
연산자의 기능 |
결합방향 |
& |
비트단위로 AND 연산을 한다. ex) num1 & num2; |
-> |
| |
비트단위로 OR 연산을 한다. ex) num1 | num2; |
-> |
^ |
비트단위로 XOR 연산을 한다. ex) num1 ^ num2; |
-> |
~ |
단항 연산자로서 피연산자의 모든 비트를 반전시킨다. ex) ~num; // num은 변화 없음, 반전 결과만 반환 |
<- |
<< |
피연산자의 비트 열을 왼쪽으로 이동시킨다. ex) num << 2; // num은 변화 없음, 두 칸 왼쪽 이동 결과만 반환 |
-> |
>> |
피연산자의 비트 열을 오른쪽으로 이동시킨다. ex) num >> 2; // num은 변화 없음, 두 칸 오른쪽 이동 결과만 반환 |
-> |
1) & 연산자 : 비트단위 AND
- & 연산은 두 개의 비트가 모두 1일 때 1을 반환하는 연산입니다.
- 0 & 0 0을 반환
- 0 & 1 0을 반환
- 1 & 0 0을 반환
- 1 & 1 1을 반환
2) | 연산자 : 비트단위 OR
- | 연산은 두 개의 비트 중 하나라도 1이면 1을 반환하는 연산입니다.
- 0 | 0 0을 반환
- 0 | 1 1을 반환
- 1 | 0 1을 반환
- 1 | 1 1을 반환
3) ^ 연산자 : 비트단위 XOR
- ^ 연산은 두 개의 비트가 서로 다른 경우에 1을 반환하는 연산입니다.
- 0 ^ 0 0을 반환
- 0 ^ 1 1을 반환
- 1 ^ 0 1을 반환
- 1 ^ 1 0을 반환
4) ~ 연산자 : 비트단위 NOT
- ~연산은 비트를 0에서 1로, 1에서 0으로 반전시키기 때문에 보수연산이라고도 합니다.
- ~0 1을 반환
- ~1 0을 반환
* ~ 연산자는 부호비트 조차 반전시킵니다. ~ 연산자를 사용해 2의 보수를 구하려는 경우 ~연산을 사용한 값에 + 1을 해줘야 2의 보수가 구해집니다.
5) << 연산자 : 비트의 왼쪽 이동(Shift)
- << 연산자는 두 개의 피연산자를 요구합니다.
- num1 << num2 num1의 비트 열을 num2칸씩 왼쪽으로 이동시킨 결과를 반환 합니다.
- 8 << 2 8의 '비트열'을 2칸씩 왼쪽으로 이동시킨 결과를 반환 합니다.
* 비트의 열을 왼쪽으로 1칸씩 이동시킬 때마다 정수의 값은 두 배가 됩니다. 이를 토대로 반대의 경우 정수의 값은 반절로 나누어 지는 것을 알 수 있습니다.
6) >> 연산자 : 비트의 오른쪽 이동(Shift)
- >> 연산자와 << 연산자의 가장 큰 차이점은 비트의 열을 이동 시키는 방향에 있습니다.
- << 연산의 경우 0을 채워넣으면 되니까 상관이 없지만, >> 연산의 경우 양수가 아닌 음수의 비트열을 이동시킬 경우에 음수를 유지 할 것인가, 그렇지 않을 것인가에 따라 나눠지게 됩니다. (이 경우 CPU에 따라 계산 방식의 차이를 보이게 됩니다.)
- 음수를 유지하는 CPU의 경우 1을 채워 넣고, 그렇지 않은 CPU의 경우 0을 채워 넣게 됩니다.
* 음수를 유지하는 CPU에서의 연산 결과 입니다.
이것으로 데이터 표현방식을 마치도록 하겠습니다.
다음은 상수와 기본 자료형에 대하여 공부하고, 글을 올리도록 하겠습니다.
'프로그래밍 언어 > C' 카테고리의 다른 글
C언어 반복문 - while문(1) (0) | 2017.01.02 |
---|---|
C언어 printf 함수 와 scanf 함수 (0) | 2017.01.01 |
C언어 상수와 기본 자료형 (0) | 2016.12.27 |
C언어 변수와 연산자 (0) | 2016.12.24 |
C언어 공부 시작 (0) | 2016.12.21 |