Computer Science/시스템 프로그래밍

[시스템 프로그래밍] 01. Data Representation

lumana 2024. 4. 2. 22:14

Binary Integers(2진수)

  • electronic charge를 통해 컴퓨터의 메모리에 코드, 데이터를 저장함
  • MSB : the most significant bit (가장 왼쪽에 있는 bit)
  • LSB : the least significant bit (가장 오른쪽에 있는 bit)
  • Signed or Unsigned
    • Singed : Positive or negative
    • Unsigned : Positive
    • 0(Zero) :  Postive Integer

Decimal을 Unsigned Binary로 변환하는 방법

  • 특정 수를 2로 나눈 나머지들을 역순으로 나열한다
  • ex) 37 % 2 = 1 / 18 % 2 = 0 / 9 % 2 = 1, 4 % 2 = 0 / 2 % 2 = 0 / 1 % 2 = 1 /
  • 위 나머지를 역순으로 배치하면 2진수 100101이 된다
  • 2진수로 표현하기 위한 자리 수를 계산하는 법
    • log_2(n)의 정수 값 + 1
      • or ceiling(log2(n))
    • ex) log_2(37) : 5.xxx --> 표현하는데 6자리가 필요하다
      • x자리로는 최대 (10진수) 2^x - 1 까지 표현 가능하기 때문

Unsigned Binary Addition

  • 더할 때 발생하는 Carry는 next-highest bit에 더해주면 된다
  • 최상위 bit에서 발생하는 Carry는 버린다(ex. 1111 1111 + 0000 0001 => 0000 0000)
    • 표현할 수 있는 수의 range를 넘는 Overflow의 한 종류

Integer Storage Size

  • X86 컴퓨터에 데이터의 기본 저장 단위는 byte(8 bit) 임
  • Byte : 1 byte / Word : 2 byte / Doubleword : 4 byte / Quadword : 8 byte / Duble quadword : 16 byte

 

Hexadecimal Integer(16진수)

  • 16 진수를 통해 큰 수의 2진수를 편하게 읽을 수 있음
    • 16진수 각 자리는 4개의 bit를 표한할 수 있기 때문
    • 2개의 16진수는 1byte를 표현할 수 있다
  • 0001 0110 1010 0111 1001 0100은 16진수 16A794로 표현할 수 있다

 

Signed Binary Integers

  • 양수 / 음수
  • MSB(가장 왼쪽에 있는 bit)가 부호를 나타냄
    • 0 : positive
    • 1 : negative

 

2의 보수법(Two's-Complement Representaion)

  • 음수를 나타내기 위해 2의 보수법을 사용함
    • -A + A = 0 처럼, 합이 0임을 이용한 표기법
  • 0은 1로, 1은 0으로 Inverse 한 뒤, 1을 더해주면 된다
    • 0000 0001을 1111 1110으로 Inverse 한 후, 1을 더해 1111 1111로 표현한다(-1)
  • 2의 보수법은 Processor 디자이너에게 유용함
    • addition circuit과 subtraction circuit을 분리해서 따로 만들지 않아도 됨
    • A - B는 A + (-B)의 덧셈으로 연산하면 되기 때문
  • 16진수를 2의 보수법을 통해 나타내는 방법
    • First, 부호를 확인
      • 가장 왼쪽에 있는 수가 8 이상이면 음수
        • 1000(16진수: 8) 부터는 음수이기 때문 
    • Second, 15에서 각 자리수를 빼주고, 1을 더해준다
      • ex) 6A3D --> 95C3
  • Signed Binary를 Decimal로 표현하는 방법(2의 보수법을 활용)
    • 최상위 bit가 0인 경우 --> 양수
    • 최상위 bit가 1인 경우 --> 음수
      • 음수를 2의 보수법을 통해 절대값을 구하고, 그 절대값에 (-) 부호를 붙여준다
      • ex) 1111 0000 --> 0001 0000 --> 16 --> -16
  • Signed Decimal을 Binary로 표현하는 방법(2의 보수법을 활용)
    • 양수 --> 2로 나눈 나머지를 나열
    • 음수 --> 절댓값을 2진수로 표현하고, 2의 보수법을 통해 표현하면 끝
    • ex) -43 --> 43의 2진수 : 00101011 --> 2의 보수를 거쳐 11010101
  • Signed Decimal을 Hexadecimal로 표현
    • 양수 --> 16진수로 나눈 나머지를 나열 
    • 음수 --> 10진수를 2진수로 표현하는 과정과 유사함
      • 절대값을 2진수로 표현하고, 2의 보수를 취한 후 4자리씩 읽어서 표현하면 된다
      • -43의 경우 1101 0101이고, 이를 4자리씩 계산해 16진수 D5로 나타내면 된다
  • Signed Hexadecimal을 Decimal로 표현
    • 양수 --> 16의 거듭제곱의 합으로 구하면 됨
    • 음수 --> 2의 보수를 취해 10진수로 표현하고, (-)를 붙여준다

 

Signed Binary Integer의 최대 / 최솟 값

  • n 비트로 이루어진 SignedBinary Integer는 최상위 비트를 부호를 나타내는데 사용하므로 n-1 bit만 수를 표현하는데 사용한다
  • 따라서 -2^n 부터 2^n - 1까지 표현할 수 있다
  • ex) 8bit Signed Binary Integer의 경우 -128 ~ 127까지 표현 가능하다.

 

Binary Subtraction

  • 2의 보수법을 이용해 뺄셈을 덧셈으로 접근할 수 있다.(컴퓨터의 계산 방식)
  • 여유분의 extra bit가 있다면 뺄셈 과정에서 발생하는 carry는 무시한다
    • 여유분의 extra bit가 없다면 Overflow 발생

 

Overflow

  • 주어진 digit의 수로 나타낼 수 있는 범위를 넘어서는 수로 계산되는 경우, Overflow가 발생한다
    • ex) Unsigned 1111 1111 + 0000 0001 --> 0000 0000 // 255 + 1 --> 0
    • ex) Unsigned 0000 0000 - 0000 0001 --> 1111 1111 // 0 - 1 --> 255
    • ex) Signed 0111 1111 + 0000 0001 --> 1000 0000 // 127 + 1 --> -128
    • ex) Signed 1000 0000 - 0000 0001 --> 0111 1111 // -128 - 1 --> 127
  •  표현할 수 있는 수의 최솟값에서 어떤 수를 빼는 경우 최댓값으로 넘어가거나, 최댓값에서 어떤 수를 더해 최솟값으로 넘어가는 경우 모두 Overflow라고 한다. (Underflow는 부동 소수점에서 flow를 이야기 할 때 사용되는 용어이다)
  • Overflow는 두 수가 모두 양수이거나, 모두 음수인 경우에만 발생한다
    • 두 Unsinged number가 더해지는 경우 MSB에서 Carry out이 발생하는 지 확인하면 Overflow의 여부를 확인할 수 있다
    • 두 Signed number가 더해지는 경우 MSB는 부호를 나타내기 때문에, overflow의 여부를 나타내지 않는다
  • Signed number에서는, sign bit의 carry in과 carry out을 비교해, 두 carry가 같지 않다면, overflow가 발생한 것으로 판단할 수 있다(XOR 연산).
    • ex) 70 + 80
      • 0100 0110 + 0101 0000 --> 1001 0110
        • carry in : 1, carry out : 0
        • carry in과 carry out이 다르므로, overflow가 발생함을 알 수 있다
    • ex) -70 - 80
      • 1 0111010 + 1 0110000 --> 0 1101010
        • carry in : 0, carry out : 1
        • carry in과 carry out이 다르므로, overflow가 발생함을 알 수 있다

 

Character Storage

  • 컴퓨터가 binary data만 저장한다면, 어떻게 character를 표현할까?
    • character를 integer에 매핑한 character set을 사용한다
  • 예전에는 character sets에 8 비트만을 사용했지만, 오늘날 ASCII character set은 고유한 7비트 정수가 각 character를 가리키고 있다.
  • ANSI Character Set
    • 8bit를 사용하는데, 처음 128개는 standard US keyboard의 글자와 symbol에 해당함
    • 이후 128개는 interational alphabet, accents, currency symbols, fraction과 같은 special character를 나타냄
  • Unicode Standard
    • 주요 언어 뿐만 아니라 유럽 알파벳, 중동, 동아시아의 언어를 포함하고 있다.
  • ASCII Strings
    • String이라 불림
    • 1개, 혹은 그 이상의 문자들의 sequence
    • ASCII string은 ASCII codes를 포함하는 bytes들을 연속으로써 메모리에 저장된다
    • null-terminated string은 문자들의 연속 뒤에, 0을 담고 있는 단일 바이트가 오는 문자열임