04.데이터 표현방식의 이해 Programming Language/열혈강의c 공부2017. 6. 29. 15:22
2017-06-28 (어제 공부한거를 바로 포스팅을 못했다.)
오늘 공부한내용
Chapter 04 데이터 표현방식의 이해
--------------------------------------------
04-1) 컴퓨터가 데이터를 표현하는 방식
컴퓨터는 2진수를 기반으로 데이터를 표현하고연산도 진행한다.
따라서 2진수를 이해해야 C언어를 보다 정확히 이해할 수 있는데
2진수란 -> 두 개의 기호를 이용해서 데이터를 표현하는 방식을 가리켜 2진수라 한다.
여기서 말하는 'n진수'에서의 n은 데이터를 표현하는데 사용하는 기호의 갯수를 의미한다.
2진수 10진수 16진수에 대해서 설명하려고한다.
여기서 16진수는 총 열여섯 개의 숫자를 이용해서 수를 표현하는데 숫자 기호의 수가 10개밖에 되지 않으므로
문자기호까지 동원해서 표현한다.
간단하게 표로 표현하자면
2 진수 |
10 진수 |
16 진수 |
0 |
0 |
0 |
1 |
1 |
1 |
|
2 |
2 |
|
3 |
3 |
|
4 |
4 |
|
5 |
5 |
|
6 |
6 |
|
7 |
7 |
|
8 |
8 |
|
9 |
9 |
|
10 |
A |
|
11 |
B |
|
12 |
C |
|
13 |
D |
|
14 |
E |
|
15 |
F |
|
16 |
10 |
17 | 11 |
그래서 16진수는 문자 A는 정수10 그외 .. 등으로 표현하였다.
10진수는 언제 자릿수가 증가할까?
정수 9다음에 증가한다 -->왜??--> 한 자릿수를 가지고 표현할 수 있는 최댓값이 9이기 때문이다.
그렇다면 2진수는??
한 자릿수 내에 표현할 수 있는 최댓값이 1이므로 1다음에 자릿수가 증가한다.
16진수도 마찬가지다.
데이터의 표현방식의 이해에서 16진수를 왜 설명하냐면 2진수 네 개는 16진수 하나로 표현이 가능하기 때문이다
그래서 16진수를 적지 않게 사용하기 때문에 익숙해질 필요가 있다.
< 데이터의 표현 단위인 비트(Bit)와 바이트(Byte) >
'비트'는 컴퓨터가 표현하는 데이터의 최소단위다.
--> 2진수 값 하나를 저장할 수 있는 메모리의 크기를 뜻하는 단위
비트를 여덟 개 묶으면 '바이트'라는 단위가 구성되다.
1Byte = 8bit
04-2) 정수와 실수의 표현방식
<정수의 표현 방식>
c언어는 보통 하나의 정수를 4바이트로 표현한다.
정수를 표현하는데 있어서 가장 왼쪽에 존재하는 비트를 '부호비트'라고 한다.
양수라면 0, 음수라면 1을 저장하여 부호를 표시한다.
그래서 이 비트를 가리켜 MSB라고 한다. Most Significant Bit의 약자로 가장 중요한 비트라는 뜻을 지닌다,
<음수 정수의 표현>
음수 정수를 표현할 때에는 2의 보수를 취해야 한다.
그전에 보수는 왜 사용하는 걸까?
컴퓨터에는 (-)라는 개념이 없기 때문에 보수를 사용한다.
1의보수는 음수 표현시에 0을 1로, 1을 0으로 바꿔주는것인데
1의 보수는 0이라는 개념이 없을때에는 그냥 사용해도 좋으나
0의 개념이 들어갈 경우 1의 보수로 한다면 (+)0과 (-)0이 나오게 된다.
분명 0은 하나밖에 없는데, 음 양의 개념으로 나뉜다면 계산시에 컴퓨터가 오작동할 문제가 있다.
그래서 이를 방지하기 위해 2의 보수를 사용한다.
2의 보수는 0의 개념이 하나로 지정되기 때문에 컴퓨터가 오작동할 이유가 없다.
따라서 음수 계산 및 기타 계산은 1의 보수 또는 2의 보수 두랃 사용이 가능하지만
0의 개념을 하나로 통합시켜 사용할때는 2의 보수를 사용하는게좋다.
(1의 보수는 결과에 캐리가 발생시 캐리값을 연산해주어야 하지만
2의 보수는 발생한 캐리를 무시하기 때문에 다른 처리를 할 필요가 없다, -->나중에 자세히 포스팅)
2의 보수는 1의 보수를 취해준뒤에 1을 더하면 2의 보수가 된다.
<실수표현방식>
실수를 표현하는 방식은 부동소수점 방식을 사용하는데.. 대략적으로 이런것이 있다 하고 이해하고 넘어가면 되는 부분이라서
이건 나중에 2의보수와 함께 자세하게 다루겠다.
컴퓨터가 실수를 표현하는 방식에는 오차가 존재한다는것은 알아두자
컴퓨터가 우리가 표현하고자 하는 실수 값을 정확하게 표현하는게 아니라, 아주 가까운 문제가 없을 만큼의 근사치를 통해서 실수를 표현하기 때문이다.
04-3)비트연산자
비트 단위로 연산을 진행하는 연산자를 비트 연산자라고한다 주로 하드웨어 관련 프로그래밍에 활용된다
메모리 공가느이 효율성을 높이고 연산의 수를 줄이는 요인이다.
<&연산자: 비트단위 AND>
& 연산은 두 개의 비트가 모두 1일 때 1을 반환하는 연산이다
0 & 0 0반환
0 & 0 0반환
1 & 0 0반환
1 & 1 1반환
< |연산자 : 비트단위 OR >
| 연산은 두 개의 비트 중 하나라도 1이면 1을 반환하는 연산
0 | 0 0반환
0 | 0 1반환
1 | 0 1반환
1 | 1 1반환
< ^연산자: 비트단위 XOR >
^연산은 두 개의 비트가 서로 다른 경우에 1을 반환하는 연산
0 ^ 0 0반환
0 ^ 1 1반환
1 ^ 0 1반환
1 ^ 1 0반환
< ~연산자: 비트단위 NOT >
~연산은 비트를 0에서 1로, 1에서 0으로 반전시키기 때문에 보수연산이라고도 불린다.
~0 1반환
~1 0반환
-->MSB 도 반전되어 부호마저 바뀐다는 사실 알아두기
< <<연산자: 비트의 왼쪽 이동(Shift) >
<<연산자는 두개의 피 연산자를 요구하며 다음의 의미를 갖는다.
num1 << num2 num1의 비트 열을 num2칸씩 왼쪽으로 이동시킨 결과를 반환
8 << 2 정수 8의 비트 열을 2칸씩 왼쪽으로 이동시킨 결과를 반환
예제를 보자
-----------------------------------------------------------
<BitLeftShift.c>
#include <stdio.h>
int main (void)
{
int num = 15; // 00000000 00000000 00000000 00001111
int result1 = num<<1; //num의 비트 열을 왼쪽으로 1칸씩 이동
int result2 = num<<2; // num의 비트 열을 왼쪽으로 2칸씩 이동
int result3 = num<<3; // num의 비트 열을 왼쪽으로 3칸씩 이동
printf("1칸 이동 결과: %d \n", result1);
printf("2칸 이동 결과: %d \n", result2);
printf("3칸 이동 결과: %d \n", result3);
return 0 ;
}
-------------------------------------------------------------------------------------------
실행 결과
1칸 이동 결과: 30 // 2진수표현 00000000 00000000 00000000 00011110
2칸 이동 결과: 60 // 2진수표현 00000000 00000000 00000000 00111100
3칸 이동 결과: 120 // 2진수표현 00000000 00000000 00000000 01111000
비트의 이동으로 인해서 생기는 오른쪽 빈 칸은 0으로 채워지고, 이동으로 인해서 밀려나는 왼쪽 비트들은(4바이트를 넘어서는 비트들은) 그냥 버려진다.
비록 그 값이 1이더라도 말이다.
위의 예제를 보면 다음 사실도 알 수 있다.
""비트의 열을 왼쪽으로 1칸씩 이동시킬 때마다 정수의 값을 두 배가 된다."
그리고 위의 내용을 토대로 다음 사실도 알 수 있다.
"비트의 열을 오른쪽으로 1칸씩 이동시킬 때마다 정수의 값은 2로 나누어진다."
num에 14 를 넣어서 해보니까 28 56 112가 출력됬다 ㅋㅋ 다른수로 해도 마찬가지!
< >>연산자 : 비트의 오른쪽 이동(Shift) >
>>연산자와 <<연사자의 가장 큰 차이점은 비트의 열을 이동시키는 방향에 있다.
num >> num2
num2의 크기만큼 num1의 비트 열이 오른쪽으로 이동한 결과가 반환된다.
물론 num1이 양수라면 이동으로 인해 밀려나는 오른쪽 비트들은 소멸되고
이동으로 인해 생긴 왼쪽 빈자리는 0으로 채워진다.
그러나 num1이 음수라면 이야기는 달라진다
이 결과는 cpu에 따라서 달라지는데 음의 값을 유지하기 위해 1을 채우는 cpu도 있고 음의 값 유지에 상관하지 않고 0을 채우는 cpu도 있다.
'Programming Language > 열혈강의c 공부' 카테고리의 다른 글
03.변수와 연산자 (0) | 2017.06.27 |
---|---|
02.프로그램의 기본구성 (0) | 2017.06.27 |
01.이것이 c언어다. (0) | 2017.06.26 |
00.시작 (0) | 2017.06.26 |