questionet

CS 기초, 2진수의 음수 표현, 2의 보수, 16진수와 8진수, 아스키, 유니코드 본문

Learning questions/기초 개념

CS 기초, 2진수의 음수 표현, 2의 보수, 16진수와 8진수, 아스키, 유니코드

orthanc 2024. 4. 8. 16:21

2장

n비트는 2^n 개의 정보를 담을 수 있다.

1 Byte = 8 Bit
10진수 (Decimal)      2진수 (Binary)
보조기억 장치의 용량 표시 프로그래밍 상에서의 메모리 크기 표시
1 KB   = 1000 Byte  1 KiB = 1024 Byte
1 MB   = 1000 KB   1 MiB = 1024 KB
1 GB   = 1000 MB   1 GiB = 1024 MB
1 TB   = 1000 GB  1 TiB = 1024 GB

 

 

이진수의 음수 표현 :
이진법의 2의 보수를 구해 이 값을 음수로 간주하는 방법

보수 complementary number : 
R진법에서 R-1의 보수, R의 보수(진보수) 가 정의된다.
예를 들어, 10진법에서 9의 보수, 10의 보수
                   2진법에서 1의 보수, 2의 보수

R-1의 보수 :
임의의 두 수에 대해, 각 자릿수의 합이 R-1이 될 때 
두 수가 R-1의 보수관계에 있다.

10진법에서 9의 보수

A + B = 999

368 + B = 999

  368      999
 +631     -368
  999      631

B = 631


십진수 368에 대한 9의 보수는 631


R의 보수 :
임의의 두 수에 대해, 각 자릿수의 합에서 자리올림이 발생해 해당자리가 0이될 때
두 수는 R의 보수관계에 있다.

10진법에서 10의 보수

A + B = 1000

368 + B = 1000

  368      1000
 +632      -368
 1000       632


십진수 368에 대한 10의 보수는 632


R의 보수는 R-1의 보수+1과 같다 

2진법에서 1의 보수 : 
각 자릿수를 더했을 때 각 자릿수가 1이 되게 하는 수 
= 각 자리의 비트를 반전시킨 수

1001 의 1의 보수는
0110

 1111
-1001
 0110



2진법에서 2의 보수 : 
각 자리의 비트를 반전한 후 1을 더한 수

1001 의 2의 보수는
0111

10000
-1001
00111


2진수에서 1의 보수를 만드는 법은 각 자리의 비트를 반전시키기만 하면 되므로 쉽고
2의 보수를 만드는 건 거기에 1만 더하면 되므로

2진수에서 2의 보수를 만드는 방법은 매우 쉽다


이진수의 2의 보수를 활용하면 음수를 쉽게 표현할 수 있다
4비트 만으로 수를 나타낸다고 했을 때,
먼저 이 수가 양수인지 음수인지를 구분하기 위해 가장 왼쪽(최상위) 비트MSB가 0이면 양수, 1이면 음수라고 정하고

0000 0001 0010 0011 0100 0101 0110 0111
 (0)  (1)  (2)  (3)  (4)  (5)  (6)  (7)
     1111 1110 1101 1100 1011 1010 1001 1000
      (-1) (-2) (-3) (-4) (-5) (-6) (-7) (-8)


이진수의 1의 보수를 활용해서 음수를 표현하면?     

0000 0001 0010 0011 0100 0101 0110 0111
 (0)  (1)  (2)  (3)  (4)  (5)  (6)  (7)
1111 1110 1101 1100 1011 1010 1001 1000
 (-0) (-1) (-2) (-3) (-4) (-5) (-6) (-7)


16진수

1 2 3 4 5 6 7 8 9 A B C D E F 10 11 

0x10 = 10진수 16

16진수 한자릿수는 4비트 이진수와 같다

0xE = 이진수 1110 = 10진수 14
0xF = 이진수 1111 = 10진수 15
0x10= 이진수 10000= 10진수 16

따라서
4자리 16진수는, 각 자릿수를 4비트 이진수(네 자리 이진수)로 바꿔 쭉 이어 붙인 것과 같다

hex(6699) = 0x1A2B = 0001 1010 0010 1011 = 2^12 + (2^11 + 2^9) + (2^5) + (2^3 + 2 + 1)     
                                         = 4096 + (2048 + 512) + 32 + (8 + 2 + 1) 
                                         = 16^3 + (16^2 * 10) + (16^1 * 2) + 11



반대로 이진수를 16진수로 바꿀 땐, 네 자리씩 끊어서 16진수로 바꿔 이어 붙이면 된다

이진수 11010101 = 16진수 D5

즉 2진수와 16진수 사이의 변환은 매우 쉽다


같은 이치로 2진수와 8진수 사이의 변환도 매우 쉽다

이진수 101111 = 8진수 57

oct(496) = 0o762 = 111 110 010 = (2^8 + 2^7 + 2^6) + (2^5 + 2^4) + 2
                               = (256 + 128 + 64) + 48 + 2  
                               = (8^2 * 7) + 8*6 + 2

 

 

character set:
컴퓨터가 인식하고 표현할 수 있는 문자모음 (아스키, EUC-KR, 유니코드)

아스키 : 7비트로 표현, 즉 2^7 = 128개의 문자 표현 가능

A = 이진수 1000001 = 십진수 65 = ord("A") = chr(65)

a = 이진수 1100001 = 십진수 87 = ord("a") = chr(97)


유니코드 : 완성된 문자마다 고유한 값을 부여
예를 들어 글자 '한'= 0xD55C

UTF-8 : 유니코드를 인코딩하는 방식 
UTF-8 방식으로 인코딩하면 최대 4바이트 값까지 나올 수 있다.
한글은 3바이트로 표현된다

UTF-8 인코딩에서, 각 문자는 다음과 같이 인코딩된다.

1바이트 문자: 0xxxxxxx
2바이트 문자: 110xxxxx 10xxxxxx
3바이트 문자: 1110xxxx 10xxxxxx 10xxxxxx
4바이트 문자: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

3바이트 문자  1110xxxx 10xxxxxx 10xxxxxx 에서 
첫 번째 바이트: 1110는 3바이트 문자임을 나타내는 고정된 접두사
두 번째 바이트: 10은 연속 바이트임을 나타내는 고정된 접두사
세 번째 바이트: 10은 연속 바이트임을 나타내는 고정된 접두사
여기서 x는 유니코드 코드 포인트의 비트를 나타냅니다.

'가' 의 유니코드 포인트는 0xAC00 = 1010 1100 0000 0000
'힣' 의 유니코드 포인트는 0xD7A3 - 1101 0111 1010 0011
가를 UTF-8 로 인코딩하면

1110XXXX 10XXXXXX 10XXXXXX
위 X에 '가'의 유니코드 포인트가 대입된다.

11101010 10110000 10000000
이렇게 3바이트로 표현된다. 

Comments