'공부합시다/프로그래밍'에 해당되는 글 13건

  1. 2009.05.19 [프로그래밍 일반] PE구조란?
  2. 2009.04.16 [프로그래밍 일반] 부동소수점의 저장 방식
  3. 2009.04.16 [프로그래밍 일반]실수형 10진수 2진수로 변환하기
2009. 5. 19. 15:17

[프로그래밍 일반] PE구조란?

 PE(Portable Excutable)란 1993년 Microsoft사에서 표준화한 형식으로 이식성이 좋은(Portable) 실행구조(Excutable)를 의미하며 32bit 혹은 64bit의 Window OS에서 사용되는 실행 File, Object code, DLL등이 이러한 구조를 갖는다.

 PE는 API Export, Import table, data를 관리하기 위한 Resource, TLS(Thread Local Storage)들이 포함된 구조체로 이루어져 있다.

 그림에서 SESSION 영역을 보면 여러 영역들이 있는데 이중 전역변수는 .data영역에 위치하며 output 함수처럼 사용자가 만든 함수들은 .text영역에 들어간다 그리고 지역변수는 TLS에 들어가게 된다. 이처럼 PE구조에는 실행file에서 필요한 모든 정보들이 들어가 있다.

2009. 4. 16. 20:35

[프로그래밍 일반] 부동소수점의 저장 방식

부동 소수점의 저장 방식에 대하여

대부분의 CPU는 실수를 저장하는 방식인 부동 소수점을 표현하기 위해 IEEE 754 규약을 따르고 있다.

IEEE 754에 따르면 실수형 데이터타입의 대표적인 float형의 저장 방식을 다음과 같이 표현하고 있다.

float형의 데이터의 메모리 내 저장 방식

부호비트

지 수 부

가 수 부

1 bit

8 bit

23 bit

  32비트의 크기를 가진 float형의 각 비트의 의미는 다음과 같다.

1.     부호비트: 수의 부호를 표시해주는 비트로 0이면 양수 1이면 양수임을 나타낸다.

2.     지수부: 지수승을 나타내기 위한 비트이다.

3.     가수부: 첫 번째 비트는 2 -1승 두 번째 비트는 2 -2승을 나타내며 총 23비트이다.

 

 실제 예를 들어 설명하면, 3.2f를 저장한다고 하면, 먼저 3.2f는 이진수로 11.001100110011……이다. 여기서 지수승으로 표현하기 위해 소수점을 일의 자리 하나 남게 이동한다. 따라서 3.2(10) = 1.1001100110011…x21(2)이 된다.

 여기서 부호비트는 양수이므로 당연히 0이 된다.

 그리고, 지수부는 IEEE 754의 규약에 따르면 대수연산의 편의를 위해 2 n승은 127+n으로 표시한다. 위에서는 2 1승이므로 127+1 = 128이 된다. 이를 2진수로 표현하면 10000000

 또한, 가수부에서는 정수 부분의 1은 항상 존재하는 것이기 때문에 생략을 하고 그 이하 소수점 부분만을 저장한다. 따라서 가수부는 소수점 이하 23자리까지 표현하며 24번째 자리에서는 CPU의 특성에 따라 올리거나 버리게 된다. Intel CPU에서는 올리기 때문에 가수부에 저장되는 값은 10011001100110011001101이 된다.

 이를 모두 합쳐서 표현하면 0 1000000 10011001100110011001101이 된다.

 

 


 위의 실행결과 화면은 3.2f가 실제 메모리에 저장된 순서대로 16진수와 2진수로 출력한 것이다.

Intel CPU에서는 Little Endian방식으로 데이터가 저장되므로, 역순으로 나타내면 404CCCCD이며, 2진수로 나타내면,

0100 0000 0100 1100 1100 1100 1100 1101 로 위의 수와 같게 저장됨을 알 수 있다.
2009. 4. 16. 12:33

[프로그래밍 일반]실수형 10진수 2진수로 변환하기

65.75를 2진수로 바꾸어보자

65.75 = 65 + 0.75 로 나타낼 수 있다.

먼저 65를 2진수로 변환

  2│65       
   └─────
  2│ 32  ...1           △
   └─────      │
  2│ 16  ...0           │
   └─────      │
  2│  8  ...0            │
   └─────      │
  2│  4  ...0           △
   └─────      │
  2│  2  ...0           │
   └─────      │
      1  ...0              │
    ─────▷─┘
  
  따라서 65 = 1000001(2) 가 된다.
 
  이젠 0.75를 2진수로 변환해보자.
 
    0.75
  ×    2
 ─────  
    ①.50         ▽
                     ▽
    0.50           ▽
  ×    2          
 ─────   ▽
    ①.00         ▽
 
  화살표대로 읽어나가면 0.75 = 0.11(2) 가된다.
   
    0.11(2) = 1×2^(-1) + 1×2^(-2) 이다.
            = 0.5 + 0.25
            = 0.75
           
 결과적으로 65.75=1000001.11(2) 이다.