0과 1로 숫자를 표현하는 방법

mmmhmm·2024년 1월 30일
0

정보 단위

비트

  • 컴퓨터가 이해하는 가장 작은 정보 단위
  • 컴퓨터는 0과 1밖에 이해하지 못함
  • 0과 1을 나타내는 가장 작은 정보 단위를 비트라고 한다.


전구에 빗대어 표현하면 꺼짐과 켜짐으로 생각해볼수있다.

1비트는 전구가 [꺼짐], [켜짐]으로 표현이 가능하다
2비트는 전구가 [꺼짐,꺼짐], [켜짐,꺼짐], [꺼짐,켜짐], [켜짐, 켜짐]으로 4개를 표현이 가능하다.
3비트를 해보면 8개가 표현이 가능하다
규칙성이 보인다. 2ⁿ으로 정보를 표현하고 있다.

바이트

바이트는 8개의 비트로 묶인 단위 즉, 8비트 = 1바이트이다.
그러면 몇개의 정보를 나타낼수있을까? -> 2⁸ = 256개이다. 그리고 더 큰단위로 나열할수있다.

바이트(1byte)8비트(8bit)
1킬로바이트1(kB)1,000바이트(1,000byte)
1메가바이트(1MB)1,000킬로바이트(1,000kB)
1기가바이트(1GB)1,000메가바이트(1,000MB)
1테라바이트(1TB)1,000기가바이트(1,000GB)

* 워드

워드 : CPU가 한 번에 처리할 수 있는 데이터 크기를 의미함. 만약 CPU가 한 번에 16비트를 처리할 수 있다면 1워드는 16비트가 되고, 한 번에 32비트를 처리할 수있다면 1워드는 32비트가 되는것이다.
워드의 절반의 크기를 : 하프 워드(half word)
1배 크기를 : 풀워드 (full word)
2배의 크기를 : (double word)
현대 컴퓨터의 워드 크기는 대부분 32비트와 64비트이다.
프로그램 설치시 선택하는 설치파일을 선택할때 32비트파일과 64비트 파일이 바로 워드를 말하는것이다.

이진법

0과1만으로 모든 숫자를 표현하는 방법을 이진법이라고 한다.

십진수이진수
11
210
311
4100
5101
6110
7111
81000

이진수 표기법

ㅁ 이진수 8을 표기한다면

  • 1000⑵
  • 0b1000

이진수 음수 표현 (2의 보수)

쉽게 표현하자면 모든 수를 뒤집는다(1011 -> 0100)
그리고 1을 더한 값이 2의 보수이다.(0100+1 = 0101)

그렇다면 1011⑵이 음수인지 아니면 십진수5를 표현한건지 구분을 어떻게 하느냐라는 질문이 생긴다.
그건 나중에 플래그(부가정보)를 사용하기 때문에 컴퓨터가 음수인지 양수인지 알게된다.

16진법

데이터를 표현할 때 이진법 이외에 십육진법도 자주 사용한다.
십육진법은 수가 15를 넘어가는 시점에 자리 올림을 하는 숫자 표현 방식이다.

십육진수도 이진수와 같이 표현할때 15(16) 또는 ox15 사용 후자가 코드상 표기 방식이다.

십진수십육진수
00
11
22
33
44
55
66
77
88
99
10A
11B
12C
13D
14E
15F
1610
1711
......
261A

16진수를 2진수로 변환해보기

십육진수는 한 글자당 열여섯 종류(0~9)(A~F)의 숫자를 표현할 수 있다. 그렇다면 십육진수 한 숫자를 2진수로 표현하려면 비트가 4개 필요하다 2^4 = 16이니까

그림판

2진수를 16진수로 변환해보기

반대로 할 때는 당연히 반대로 숫자 4개씩 끊고, 끊어 준 네 개의 숫자를 하나의 십육진수로 변환한 뒤 그대로 이어 붙이면 된다.

코드에 16진수를 직접 넣는 사례

16진수는 프로그래밍할 때 이진수와 더불어 자주 사용되므로 기억해 두는 것이 좋다. 하드웨어와 밀접하게 맞닿아 있는 개발 분야에서는 아래와 같이 코드에 십육진수를 직접 쓰는 경우도 더러 있다.

offset = __mem_to_opcode_arm(*(u32 *)loc);
offset = (offset & 0x00ffffff) << 2;
if(offset & 0x02000000)
offset -= 0x04000000;
sffset += sym->stvalue - loc;

위의 코드를 알 필요는 없고 16진수를 직접 써 넣는 경우가 있다는 사실을 인지시키기 위해 작성했다.

profile
어라? 금지

0개의 댓글