데이터 표현방식의 이해

마블현·2024년 3월 11일

C언어

목록 보기
3/17

컴퓨터가 데이터를 표현하는 방식

2진수, 10진수, 16진수

두 개의 기호를 이용해서 데이터를 표현하는 방식을 2진수라고 한다. 마찬가지로 10개의 기호, 16개의 기호를 사용하여 데이터를 표현하는 것은 각각 10진수와 16진수이다.

2진수는 숫자 기호 0과 1만을 사용하고, 10진수는 우리가 흔히 사용하는 0부터 9까지의 숫자 기호만을 사용한다.

숫자 기호는 0부터 9까지 총 10개만 존재하기 때문에 16진수에서는 알파벳 A부터 F까지의 문자 기호를 추가로 사용한다.
0 1 2 3 4 5 6 7 8 9 A(10) B(11) C(12) D(13) E(14) F(15)

데이터의 표현단위

  • 비트(Bit): 컴퓨터가 표현하는 데이터의 최소단위로, 2진수 값 하나를 저장할 수 있는 메모리의 크기를 뜻하는 단위
  • 바이트(Byte): 비트 8개를 묶은 단위, 8bit = 1byte

8진수와 16진수를 이용한 데이터 표현

int num1 = 10;		// 특별한 선언이 없으면 10진수의 표현
int num2 = 0xA;		// 0x로 시작하면 16진수로 인식
int num3 = 012;		// 0으로 시작하면 8진수로 인식

위 세 변수는 모두 10으로 초기화된다.
8진수로 10을 표현하려면 자릿수가 증가해야하므로 010(8), 011(9), 012(10) 즉 012가 된다.


정수와 실수의 표현방식

정수의 표현방식

C언어는 보통 하나의 정수를 4바이트로 표현한다.
다만 편한 설명을 위해 하나의 정수를 1바이트로 표현하겠다.

  • 정수의 가장 왼쪽에 존재하는 비트는 '부호비트'이다.

    양수라면 0, 음수라면 1을 저장하여 부호를 표시한다. 이 비트를 가리켜 MSB라고 하는데, Most Significiant Bit의 약자로서 가장 중요한 비트라는 뜻이다.
  • 음의 정수를 표현할 때에는 2의 보수를 취해야 한다.
    MSB만 1로 표시해주면 되는거 아냐? 라고 생각할 수 있지만 아니다. 실제로 00000101(5)와 10000101(-5)을 더하면 10001010이 되는데 이는 0이 아니다.
    2의 보수를 취하는 방법은 먼저 1의 보수를 취한 후 1을 더해주는 것이다.

실수의 표현 방식

  • 컴퓨터가 실수를 표현하는 방식에는 오차가 존재한다.
    컴퓨터는 넓은 범위의 실수를 표현할 수 있지만, 실수의 표현에 오차가 존재한다.
    컴퓨터는 적은 비트의 수를 가지고 넓은 범위의 실수를 표현하기 위해 하나의 식을 정의했는데,

    바로 이 식이다. 이 형식의 식으로는 모든 실수를 정확히 표현할 수 없을 뿐더러, 0.0의 값도 만들 수 없다. 이렇듯 컴퓨터는 실수의 값을 정확하게 표현하는 것이 아니라 문제가 없을 만큼의 근사치를 통해서 실수를 표현한다.
    이러한 오차를 가리켜 부동 소수점 오차라고 한다.

    0.1을 100번 더하는 코드를 실행해보면, num의 값을 출력했을 때는 정수 10이 나와야한다.
    하지만 결과는 10의 근사치로 나온다.
    부동 소수점 오차는 C언어만의 문제가 아닌, 컴퓨터의 실수표현에 대한 한계에서 비롯된 것이므로 다른 프로그래밍 언어에도 존재하는 문제이다.

비트 연산자

&연산자: 비트단위 AND

&연산은 두 개의 비트가 모두 1일때 1을 반환하는 연산이다.
1 & 1 일 때만 1을 반환하고, 0이 하나라도 있으면 0을 반환한다.

|연산자: 비트단위 OR

|연산은 두 개의 비트가 모두 0일 때 0을 반환하는 연산이다.
0 | 0 일 때만 0을 반환하고, 1이 하나라도 있으면 1을 반환한다.

^연산자: 비트단위 XOR

^연산은 두 개의 비트가 서로 다른 경우에 1을 반환하는 연산이다.

  • 0 ^ 0: 0을 반환
  • 1 ^ 0: 1을 반환
  • 0 ^ 1: 1을 반환
  • 1 ^ 1: 0을 반환

~연산자: 비트단위 NOT

~연산은 단항 연산자로서 비트를 0에서 1로, 1에서 0으로 반전시키기 때문에 보수 연산이라고도 불린다.
NOT연산은 MSB도 반전되어 부호마저 바뀜에 조심해야한다. 2진수로 표현된 음의 정수는 2의 보수를 취한 후 크기를 확인해야한다.

<<연산자: 비트의 왼쪽 이동(shift)

<<연산자는 두 개의 피연산자를 필요로 한다.

  • num1 << num2: num1의 비트 열을 num2칸씩 왼쪽으로 이동시킨 결과를 반환
  • 8 << 2: 정수 8의 비트 열을 2칸씩 왼쪽으로 이동시킨 결과를 반환

비트의 이동으로 인해서 생기는 오른쪽 빈 칸은 0으로 채워지고, 이동으로 인해서 밀려나는 왼쪽 비트들은 버려진다.실행 결과를 보면 다음과 같은 결론을 얻을 수 있다.
비트의 열을 왼쪽으로 1칸씩 이동시킬 때마다 정수의 값은 두 배가 된다.
비트의 열을 오른쪽으로 1칸씩 이동시킬 때마다 정수의 값은 2로 나누어진다.

>>연산자: 비트의 오른쪽 이동(shift)

이동으로 인해 밀려나는 오른쪽 비트들은 벼려질 것이고, 왼쪽의 빈자리는 0으로 채워질 것이다. MSB가 0이라면 >>연산을 실행했을 때 별다른 문제가 없지만, MSB가 1이라면 어떻게 될까?

이는 CPU에 따라서 결과가 달라진다.
음의 값을 유지하기 위해 1을 채우는 CPU가 있고, 상관하지 않고 0을 채우는 CPU도 있다.
내 컴퓨터는 음의 값을 유지한다.

profile
고수로 나아가는 중

0개의 댓글