본문 바로가기
코스웨어/14년 스마트컨트롤러

2014년 3월 20일 업무일지 문대영[출석번호 11]

by 알 수 없는 사용자 2014. 3. 20.
728x90
반응형

HEXA View

파일 HEXA View  (exe 파일을 bin 파일로 수정후 Visual stdio로 띄움)

HEXA View에서 아스키 코드는 제어문자와 확장영역 표시를  . 으로 표시한다.

 

첫번째와 두번째 자리의 숫자를 아스키 코드로 나타낸다.

 

 

메모리 HEXA View (C언어 확장자 파일에서 소스코드를 작성하여 띄움)

 

 

 

HEXA View 소스

주소 출력

#include <Stdio.h>

int main()
{
  int iNum = 0XABCDEF98;
  unsigned char * ucpData = (unsigned char *)&iNum;   
  int iCnt1;
  int iCnt2;
  
  for(iCnt2=0;20>iCnt2;++iCnt2)
  {
    
    //-------------------------------//
    //--- Address View part Start ---//
    printf("%08X  ",ucpData);
    //--- Address View part end -----//
    //-------------------------------//
  }

  return 0;

}
  

 

 

 

 

 

 

 

ucpData 안에 저장되 있는 iNum의 주소값을 for문의 조건이

아닐때 까지 출력한다.

ucpData의 증가 코드가 없으므로 같은 주소값이 출력된다.

 

 

 

 

 

 

 

HEXA 출력  

 //-------------------------------//
  //--- Hexa View part Start ------//
  for(iCnt1=0;16>iCnt1;++iCnt1)
  {
   printf("%02X ",*(ucpData));
   ++ucpData;
  }
  //--- Hexa View part end ---//
  
//--------------------------//

 

 

ucpData안의 저장된 iNum주소에 저장된 값을 2자리씩 출력한다.

 

 

 

 아스키 코드 출력

 for(iCnt1 = 0;16>iCnt1;++iCnt1)
  {
   if(32>*ucpData)
   {
    printf(".");
   }
   else if(127<*ucpData)
   {
    printf(".");
   }
   else
    printf("%c",*ucpData);
  
   ++ucpData;
  }

 

 

0~31번째까진 제어문자영력이고 128번째부터 그 위로는 확장자영역이다.

if ~ else if문의 조건이면 . 을 출력하고 아니면 아스키 코드로 출력한다.

 

 

 

 

 

포인터 연산자를 이용한 주소에 저장된 실수 출력 

 #include <stdio.h>

int main()
{
  float fNum = 3.25;
  unsigned char * ucpData =(unsigned char *)&fNum;
      

  printf("%02X\n",*(ucpData+0));
  printf("%02X\n",*(ucpData+1));
  printf("%02X\n",*(ucpData+2));
  printf("%02X\n",*(ucpData+3));

  printf("%f\n",fNum);
  
  *(ucpData+0)=0X00;
  *(ucpData+1)=0X00;
  *(ucpData+2)=0XB9;
  *(ucpData+3)=0X41;
  
  printf("%f\n",fNum);
  printf("%f\n",fNum);

  return 0;
}

 

 

 

 

 

 

 

 

 

 

 

 

실수 3.25를 출력하면 40 50 00 00이 출력되는데 어떻게 저장되는지 알아보자  

앞서 C언어 5일차에서 부동소수점을 배웠을것이다. 

컴퓨터는 2진수를 기반으로 데이터를 표현하고 연산도 진행한다. 그러므로 10진수로 받은 수를 2진수로

변환하여 메모리에 저장한다.

 

 

 

 

IEEE 754 구조

 

3.25를 비트로 나타내면 3을 2진수로 변환 11 이 되고 0.25를 2진수로 변환하면 0 1 이된다

소수점 계산 방식은 0.25에 2씩 곱하여 지수의 자리값을 적어주면 된다.

0.25 * 2 = 0.5  ..... 0

0.5 * 2 = 1.0   ..... 1

 

3.25를 진수로 나타내면 11.01가 된다.

 

부동소수점 저장방식

부동소수점 방식으로 나타내기 위해서는 제일 앞에 1.xxxx*2^X로 표시해 주어야 한다.

지수부는 127 + 지수이다.

 

11.01의 부동소수점은 1.101*2^1이다

부호는 지수가 양수이면 0 음수이면 1을 적어주면 된다.

여기서 지수는 1이므로 부호자리는 0이되고 127+1을 한 값 128을 2진수로 나타내여 적어주고

소수부 자리는 1.101에서 지수자리 1을 제외한 101을 앞에서부터 적고 남은자리는 0으로 체워주면 된다.

 

 

부동소수점을 구했으면 니블방식을 이용해 부호포함 4비트씩 짤라 숫자로 나타내 주면 된다.

 

(0100 0000) (0101 0000) (0000 0000) (0000 0000)

 

 니블방식으로 구한 수를 2자리씩 저장하고 메모리에는 리틀엔디안을 적용하여 저장한다.

 

 

 

위에서 구한 부동소수점에서 3.25를 구하는 방식을 알아보자

 

지수부(1000 0000)를 10진법으로 128이 나온다 128 - 127을 하면 1이 나오는데 1은 2^1 으로 보면된다

소수부1010 0000 0000 ~~~에서 앞에 1이 있다고 보고 1.1010 0000 ~~~으로 보면된다. 

앞에서 구한 2^1과 1.1010을 곱하면 11.01이 나오고 11.01의 소수점을 1101로 바꿔주면 1101*2^-2이 된다

1101을 10진법으로 나타내면 13이 나오고 2^-2은 1/4이다 13/4로 계산하면 3.25가 나온다.

 

 

 

함수

 

 #include <stdio.h>

int main()
{
  int num1;
  int num2;
  num1 = printf("12345\n"); 
  num2 = printf("I love my home\n");
  printf("%d %d\n",num1,num2);

  return 0;
}

 

 

 

출력문은 한개인데 3개의 출력이 나오는 이유는 변수에 대입되는 수의 우선순위 때문이다. 

printf함수가 먼저 수행하고난 다음에 대입이 되기 때문에 출력이 3개가 되는것이다.

또한 출력이 되고난 후 printf함수는 자신이 출력한 길이를 반환하여  값을 나타내고 변수에 대입된다.

값을 반환하는 명칭은 printf함수의 리턴값이라고 한다.

 

 

 

 

함수와 변수 들의 주소위치

 

 

 

 

 

 

 

 

 

 

 

 

%팁 : 리눅스 manual 사용방법

man (찾고싶은 명령어명)

ex)man printf

 

 

 

 

728x90