Major in CS/System Program(시스템프로그램)

비트, 바이트, 그리고 정수형

SHJuan 2020. 1. 15. 15:36

시프 복습 시-작!

정보를 비트로 나타내기

컴퓨터에서는 정보를 왜 이진수로 표현하는가?

  • 전압의 높고 낮음을 이용하여 정보의 입력을 받는다.

  • 바이트(Byte) = 8비트(Bit)
    • 한 바이트가 표현할 수 있는 최대 십진수 값: 255
    • 0~(28-1)까지 표현가능하다.
    • 16진수로 표현하면 FF16, C에서는 0xFF16로 표현.

바이트 기반 메모리 주소표현

  • 한 프로그램은 가상 메모리를 갖고, 가상 메모리로 표현된 주소를 갖고 연산을 수행한다.
  • 따라서, 각각의 프로그램들은 메모리를 통째로 자신이 사용한다고 취급하지만, 사실은 그렇지 않다(페이징 등의 방식을 사용).
  • 실행 중인 프로그램을 프로세스라고 한다.
    • 시스템은 이러한 프로세스들에게 적절히 주소 공간을 제공한다.
    • 각 프로세스는 다른 프로세스에 영향을 주어서는 안된다.
  • 컴파일러와, 런타임 시스템이 그러한 메모리 할당을 제어한다.

Word

  • Word size: 정수형 data 표현 시 사용되는 크기
    • Machine마다 다를 수 있다.
    • 32bit, 64bit라는 식으로 표현한다.
    • 메모리의 주소도 한 word를 이용하여 표현된다.
  • 32bit machine 이라면, 최대 메모리 주소는 232-1이고, 한 메모리 slot당 1B이므로 최대 메모리 크기는 232B = 4GB이다.
  • 64bit machine 이라면, 최대 메모리 주소는 264-1이고, 한 메모리 slot당 1B이므로 최대 메모리 크기는 264B = 16EB(엑사바이트)이다.

워드 기반 메모리 주소표현 

  • 실제로 주소는 word size만큼 끊어서 사용한다.

데이터 크기

  • 컴퓨터와 컴파일러는 다양한 데이터 형식을 지원한다.
  • 경우에 따라 서로 다른 형식과 크기로서 표현한다.

Byte Ordering

  • 주소가 작은 곳에서부터 바이트 데이터를 차례로 놓는다 --> Big Endian
  • 주소가 큰 곳에서부터 바이트 데이터를 차례로 놓는다 --> Little Endian
  • Example. 0x12345678일 때(오른쪽으로 갈 수록 주소값이 크기 증가)
    • Big Endian: 12, 34, 56, 78
    • Little Endian: 78, 56, 34, 12

C에서의 문자열 표현

  • Character의 배열
  • Endian 방식과는 무관하게 메모리 주소 낮은 곳에서부터 순서대로 들어가 있음(배열이기 때문에).
  • ASCII를 따른다. 7bit. 1bit는 Parity Check를 위해 사용한다(아마도?).

코드의 기계어 표현

  • 프로그램은 instruction의 집합체.
    • 산술연산(Arithmetic Operation), 조건부 분기(Conditional Branch), 메모리 읽기/쓰기
  • 이러한 instruction은 Byte로서 표현된다. 즉, 프로그램도 Byte Sequence이다.
    • RISC: Reduced Instruction Set Computer. 각 instruction의 크기가 정해져 있다.
      • Sun, MIPS등에서 사용
    • CISC: Complex Instruction Set Computer. 각 instruction의 크기가 가변적이다.
      • Intel 계열 CPU에서 사용
  • Machine 간에 instruction 통일이 되어 있지 않다.

비트 수준 연산

불 대수(Boolean Algebra)

  • 몬지알지?

C에서의 비트 수준 연산

  • 비트 간 OR, AND, XOR, NOT이 지원됨.
  • 피연산자가 뭐가 되었건, 비트 벡터로 인식하여 비트수준의 연산을 수행한다.

C에서의 논리 연산

  • OR, AND, NOT이 지원됨.
  • 피연산자가 0이냐, 아니냐를 따져 논리값을 계산한다. 따라서 항상 0 아니면 1이 결과값

Shift 연산

  • 비트 수준으로, 자리를 옮기는 연산
  • 왼쪽으로 1회 Shift하면 그 값이 2배가 된다.
  • 오른쪽 Shift시, 2가지 방식이 있다.
    • Logical Shift: 앞 쪽을 0으로 채운다.
    • Arithmetic shift: 앞 쪽을 제일 앞의 비트 값과 같도록 채운다.