본문 바로가기
Computer Science/Computer Architecture

[컴퓨터 구조] 0과 1로 표현하는 숫자

by 진현개발일기 2024. 8. 25.

■ 정보 단위

(1) 비트 (Bit)

0(False)과 1(True)을 표현하는 가장 작은 정보 단위

 

* 2Bit로 표현할 수 있는 정보는 2^2 = 4로 총 네 가지 (00, 01, 10, 11) 가 있다.
* 즉, n Bit로 표현할 수 있는 정보는 2^n이다.

[확장된 표현]

단위 크기
1 Byte 8 Bit
1 KB 1,000 Bytes
1 MB 1,000 KB
1 GB 1,000 MB
1 TB 1,000 GB


* 과거에는 메모리가 크지 않아, 실질적으로 1,024개씩 데이터를 나누더라도, 표현을 1,000개씩 묶은 단위로 MB, KB 등을 사용 했으나, 요즘과 같은 빅데이터 시대에선 24개의 차이가 물리적으로 커지다보니 Kib, GiB와 같이 1,024개로 정확히 구분지어 사용하는 추세이다.

단위 크기
1 Byte 8 Bit
1 KiB (키비바이트) 1,024 Bytes
1 MiB (메비바이트) 1,024 KiB
1 GiB (기비바이트) 1,024 MiB
1 TiB (테비바이트) 1,024 GiB

(2) 워드 (Word)

· CPU가 한 번에 처리할 수 있는 정보의 크기 단위 (ex. 32bit, 64bit)


· 하프 워드 (Half Word) : 워드의 절반 크기
· 풀 워드 (Full Word) : 워드 크기
· 더블 워드 (Double Word) : 워드의 두 배

■ 이진법 (Binary), 십육진법 (Hexadecimal)

[이진법]

· 0과 1로 수를 표현
· 숫자가 1을 넘어가는 시점에 자리올림 (Carry)
· 우리가 일상적으로 사용하는 진법은 십진법 (Decimal)

b는 binary를 뜻함

[십육진법]

· 0 ~ 15까지의 숫자를 표현

· 0부터 9까지는 숫자를, 10부터 15까지는 차례대로 알파벳 (A, B, C, D, E, F)으로 표현

x는 Hexadecimal을 표현

 

 

[2진법 → 16진법 변환]

 

[16진법 → 2진법 변환]

 

* 머리 속에서 정리겸 그림판으로 간단히 그려봤다.

■ 부호가 존재하는 2진 정수의 표현

디지털 장치에선 부호를 구분할 수 있는 별도의 기호가 존재하지 않고 최상위 비트[MSB] 자리를 부호 비트로 할당하고 0이면 양수, 1이면 음수를 뜻함

 

[표현 방법]

(1) 부호화-크기 표현 (signed-magnitude representation)
(2) 1의 보수 (1's complement representation)
(3) 2의 보수 (2's complement representation)


■ 부호화-크기 표현 

· n비트로 구성된 2진수에서, 최상위 비트는 부호 비트 (signed bit)이고 나머지 n-1개의 비트들은 수의 절대 크기 (magnitude)를 나타냄

(예)

10진수 2진수
(+)9 0 0001001
(-)9 1 0001001
(+)35 0 0100011
(-)35 1 0100011


· 가장 간단한 개념으로 부호를 표현하지만, 덧셈과 뺄셈 연산을 수행하기 위해서는 부호 비트와 크기 부분을 별도로 처리하여야 함.

 

· 0(zero)의 표현이 두 개 존재하므로 표현할 수 있는 범위가 줄어듦.


(예)
+0 = (0 0000000)
-0 = (1 0000000)

 

 

■ 보수(Complement)를 이용한 부호를 갖는 2진수의 표현

· 1의 보수 표현 : 모든 비트를 반전 (0->1, 1->0)
· 2의 보수 표현 : 모든 비트들을 반전하고, 결과값에 1을 더함


(예)

+9 = (0 0001001)
-9 = (1 1110110) (1의 보수)
-9 = (1 1110111) (2의 보수)


+35 = (0 0100011)
-35 = (1 1011100) (1의 보수)
-35 = (1 1011101) (2의 보수)

 

· 보수를 이용하면 부호 비트가 자연스럽게 변경되고, 그 크기도 적절한 형태로 변경됨

· 2의 보수는 0에 대한 표현이 하나만 있으며, 산술 연산이 용이함

· 2의 보수는 가장 효율적이기 때문에 컴퓨터를 비롯한 디지털 장치에 부호를 갖는 2진수를 표현하는데 주로 사용됨

 

[예: 10진수 -25를 2의 보수로 표현된 2진수로 변환하는 과정]

1. 10진수를 부호가 없는 2진수로 변환 : 25 = 11001
2. 부호 비트를 삽입 : (+)25 = (0)11001
· 비트 수가 안주어지면 앞에 부호비트를 하나 추가해준다
· 만약 비트 수가 주어진다면, 비트 수에 만큼 나머지를 채워주면 된다.

  (예로 8비트로 주어졌다면, 양수이기 때문에 '000'을 앞에 추가. : +25 = 0001 1001)

 

■ 2의 보수로 표현된 2진수를 10진수로 변환

· 2의 보수로 표현된 양의 정수는 부호 비트를 제외한 크기의 비트들은 실제의 크기를 나타냄
· 부호없는 2진수를 10진수로 변환하는 방법과 동일

[방법 1]

· 부호 비트에 해당하는 최상위 비트의 자릿수를 2의 승수(2^n) 결과값으로 표현하고 (-)를 붙여 음수가 되도록 함
· 나머지 비트는 양의 정수와 동일

· 둘의 합을 계산

 

(예) 

[1010 1110]

[방법 2]

· 2진수 음의 정수를 보수를 이용하여 양의 정수로 만들고 10진수로 변환.
· 최종 단계에서 (-) 부호를 붙이는 방식

(예)
1단계: 2의 보수를 이용하여 음수를 양수로 변환 (10101110 -> 01010010)
2단계:

 

[0101 0010]

 

■ 2의 보수를 사용한 n비트의 이진수 표현 (★)

· 표현할 수 있는 수의 범위는 -4 ~ 3이 되며, 이것은 -2^(3-1) ~ 2(3^-1)-1로 표현됨
· 2의 보수에서 최소와 최대를 더하면 항상 -1이 됨

 

(ex) 

C# int [부호있는 32비트 정수]의 데이터 크기 범위:  -2,147,483,648 ~ 2,147,483,647

* 참고: 마소 공식문서

 

· n비트 데이터의 경우로 일반화 해서 수의 범위를 나타내면 아래와 같음

[N비트 데이터의 범위]


(ex1) 4비트 범위 = -8 ~ +7
(ex2) 8비트 범위 = -128 ~ +127

■ 비트 확장 (Bit Extension)

· 부호가 존재하는 데이터의 비트 수를 늘리는 연산을 '비트 확장'이라고 함


[방법1: 부호화-크기 표현의 비트 확장]

· 부호 비트를 확장되는 최상위 자리로 이동시키고, 나머지 새로 확장되는 크기 비트들은 0으로 채움.

 

(ex1)

+21 = (00010101 : 8bit) -> (0000000000010101: 16bit)

 

(ex2) 

-21  = (10010101 : 8bit) -> (1000000000010101: 16bit)

 

[방법2: 2의 보수로 표현된 2진수의 비트 확장]

· 확장되는 상위 비트들을 부호 비트와 동일한 값으로 채우며, 이것을 부호 비트 확장 (sign-bit extension)이라고 함


(ex1)

+21 = (0001 0101 : 8bit) -> (0000 0000 0001 0101: 16bit)


(ex2)

-21  = (1110 1011 : 8bit) ->  (1111 1111 1110 1011: 16bit) 

* 위 예시 두 개를 확인해보면 부호 확장된 양의 정수에 대해 2의 보수를 취하면 부호 확장된 음의 정수와 값이 같다는 것을 확인할 수 있음 구해진 2의 보수는 음의 정수와 동일하므로 부호 비트 확장의 방법이 '정당함'을 보여줌.

 

 

■ 소수 (Decimal Fraction)의 표현

(1) 정수와 소수를 포함한 10진수

: (137.625) = 137 + 0.625

(2) 10의 지수 승 형태로 표시

: 137 + 0.625 = (1 * 10^2) + (3 * 10^1) + (7 * 10^0) + (6 * 10^-1) + (2 * 10^-2) + (5 * 10^-3)

· 정수 부분의 가수는 기수 10으로 연속으로 '나눗셈'을 수행해 얻은 나머지로 구할 수 있음


· 소수 부분은 지수가 음의 정수이므로 가수는 나눗셈의 반대인 '곱셈'을 연속적으로 수행하는 것.
 그리고 정수 부분으로 발생하는 자리올림수가 가수가 됨


(3) 소수를 포함하는 10진수의 2진수 표현

· 정수 부분은 2로 연속적인 나눗셈을, 소수 부분은 2로 연속적인 곱셈을 수행함. (10진수와 동일)


1. 정수 부분과 소수 부분을 분리함
2. 정수 부분의 10진수를 2진수로 변환: (137)   = (10001001)
3. 소수 부분의 10진수를 2진수로 변환: (0.625)   = (0.101)
4. 얻어진 정수와 소수의 2진수를 합함. (137.625) = (10001001) + (0.101) = (10001001.101)

 

(4) 소수를 포함하고 있는 2진수의 10진수로 변환

· 정수 부분은 기존의 방법과 같이 2의 지수 승일 이용하여 분해. 소수점 이하는 2의 (-)지수 승을 사용함


(예) 이진수 1101.101를 십진수로 변환

 

 

 

■ 고정소수점 (fixed-point) 표현

· 소수가 고정된 소수점을 통해서 구분하여 표현된 방식 (예: 17.60)
· 표현 범위의 한계가 있어 아주 큰 값과 매우 작은 값을 표현하는 것이 불가능함

■ 부동소수점 (floating-point) 표현

· 지수를 사용 소수점의 위치를 이동하여 수의 표현 범위를 확대함
(ex1) 176,000 = 1.76 * 10^5, 0.000176 = 1.76 * 10^-4

· 부동소수점 수를 표현하는 일반적인 형식


· 여기서 M은 가수(significand), B는 기수(base)E는 지수 (exponent)를 나타냄

 

■ 2진 부동소수점 수 (Binary Floating-point Number)

(1) 단일-정밀도(single-precision) 부동소수점 수   : 32비트[float]로 표현
(2) 복수-정밀도(double-precision) 부동소수점 수 : 64비트[double]로 표현 (128비트까지 표현 가능 [decimal])

 

728x90