2015년 8월 17일 월요일

C 언어 - 계산

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진수로 표기하면
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");
}

비트를 활용하면 메모리를 절약하면서 여러 상태를 기억할 수 있다.

댓글 없음:

댓글 쓰기