2진수
- 10진수는 0 1 2 3 4 5 6 7 8 9 로 숫자를 표현한다.
- 8진수는 0 1 2 3 4 5 6 7 로 숫자를 표현한다.
- 16진수는 0 1 2 3 4 5 6 7 8 9 a b c d e f 로 숫자를 표현한다.
- 2진수는 0 1 로 숫자를 표현한다.
2진수는 가짓수가 0 과 1 뿐이다.
컴퓨터 기억 소자 (1 비트) 는 전기적 상태를 기준으로 0 과 1 로 구분된다.
기억 소자 8개가 보여 1바이트를 이룬다.
char 형이 1 바이트 이다.
1바이트로 표현할 수 있는 가지수는 2의 8제곱 = 256 가지 이다.
2진수로 16 진수 0 ~ f 까지 표현하면 이렇다.
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
8 1000
9 1001
a 1010
b 1011
c 1100
d 1101
e 1110
f 1111
2진수 와 16진수를 오가는게 10진수와 변환하는 거 보다 잘 맞는다.
사칙 연산
더하기, 빼기, 나누기, 곱하기
printf("%d\n", 1 + 2);
printf("%d\n", 1 - 2);
printf("%d\n", 1 / 2);
printf("%d\n", 1 * 2);
실행:
3
-1
0
2
division by zero
0 으로 나누면 런타임 에러가 발생한다.0 을 나누는 거는 허용된다.
- 2 / 0 은 런타임 에러
- 0 / 2 는 문제 없음 (결과는 0)
소수점 계산
float 나 double 형을 사용한다.
float a = 0.1;
float b = 0.2;
float sum = a + b;
printf("%f\n", sum);
실행:
0.300000
printf 문에서는 %f 를 사용한다.
소수점 절삭
float 형을 int 에 대입하면 어떤 일이 일어날까?
printf("%d\n", (int)0.1);
printf("%d\n", (int)0.2);
printf("%d\n", (int)0.4);
printf("%d\n", (int)0.5);
printf("%d\n", (int)0.6);
printf("%d\n", (int)0.9);
printf("%d\n", (int)1.0);
실행:
0
0
0
0
0
0
1
나머지 계산
printf("%d\n", 10 % 3);
실행:
1
비트 연산
OR 연산과 AND 연산, NOT
OR 연산 : |
- printf("%d\n", 0 | 0); // 0
- printf("%d\n", 0 | 1); // 1
- printf("%d\n", 1 | 0); // 1
- printf("%d\n", 1 | 1); // 1
AND 연산 : &
- printf("%d\n", 0 & 0); // 0
- printf("%d\n", 0 & 1); // 0
- printf("%d\n", 1 & 0); // 0
- printf("%d\n", 1 & 1); // 1
NOT
- printf("%x\n", !0xff); // 0
- printf("%x\n", !0x00); // 1
shift 연산
원하는 만큼 비트를 이동한다.
printf("%x\n", 0xff >> 1);
printf("%x\n", 0xff << 1);
실행:
7f
1fe
7f 는 2진수로 표기하면
1fe 는 2진수로 표기하면
0111 1111
1fe 는 2진수로 표기하면
0001 1111 1110
반전
printf("%x\n", ~0xff);
printf("%x\n", ~0x00);
실행:
ffffff00
ffffffff
flag 예제
비트 연산을 이용해 flag 값으로 사용하기도 한다.
#define READ 0x01
#define WRIT 0x02
#define EXEC 0x04
#define SPEC 0x08
int permission = 0x0f;
if (permission & READ) {
printf("read permission\n");
}
if (permission & WRIT) {
printf("write permission\n");
}
if (permission & EXEC) {
printf("execute permission\n");
}
if (permission & SPEC) {
printf("special permission\n");
}
비트를 활용하면 메모리를 절약하면서 여러 상태를 기억할 수 있다.
댓글 없음:
댓글 쓰기