본문 바로가기

보고서/10월 업무일지

10월 14일 업무일지

#include <stdio.h>

int main()
{
  int A;
  int B;
  int C;
  int D;
  float E;
  float F;
  float G;
  float H;
  short I;
  char J;
  int *K;
  char L;
  char *M;
  
  printf("%p\n",&A);
  printf("%p\n",&B);
  printf("%p\n",&C);
  printf("%p\n",&D);
  printf("%p\n",&E);
  printf("%p\n",&F);
  printf("%p\n",&G);
  printf("%p\n",&H);
  printf("%p\n",&I);
  printf("%p\n",&J);
  printf("%p\n",&K);
  printf("%p\n",&L);
  printf("%p\n",&M);
  
  return 0;
}

주소값을 표현해보면




이런식으로 메모리에 저장이 되는데 비어있는 공간이 생긴다(검은색 칠해진 부분) 이 메모리는 결국사용을 하지 않는다. 과거에는 메모리의 양이 적어서 사용을 하지만 요즘에는 메모리의 용량이 커져서 저 빈공간이 매우 미미한 양이므로 사용하지 않는다.
pc는 보통 32비트이기 때문에 최적화를 시킬때에 4의 배수 --->2의 배수 ---> 1의배수 순으로 최적화를 한다.
pc의 버스가 32비트를 보내면 32 비트를 전송하지만 8비트를 보내면 24비트를 차단시킨후 8비트만 보내기 때문에 32비트 보낼때보다 8비트를 보낼때가 속도가 느리다.

위 그림에서  L을 J앞의 빈공간을 사용해서 보낼수가 있는데 이것이 속도 최적화 방식이다.
pc에서는 메모리가 크기 때문에 메모리 최적화 보다는 속도 최적화에 중점을 둬야하고, 임베디드 에서는 속도 또는 메모리 둘 중 하나를 선택하여 최적화를 해야한다. 상황에 따라 최적화 방식을 선택하면 된다.



#include <stdio.h>

int main()
{
  int iNum=0x12345678;
  unsigned char *p;
  p=(unsigned char*)&iNum;
  
  printf("%08x\n",iNum);
  printf("%p\n",&iNum);
  printf("%p\n",p);
  printf("%02X\n",*p);
  ++p;
  printf("%p\n",p);
  printf("%02X\n",*p);
  ++p;
  printf("%p\n",p);
  printf("%02X\n",*p);
  ++p;
  printf("%p\n",p);
  printf("%02X\n",*p);
  
  
  return 0;
}

12345678이 출력되는데 메모리에서는
 12  34  56  78
 0x18  0x19  0x1a  0x1b

이렇게 저장된다고 배웠다.

하지만 실제로는

78 56 34 12
 0x18  0x19  0x1a  0x1b



0x 12345678 에서 (12)가 start 이고 78이 end 이다

이렇게 거꾸로 저장되는 방식을 Little Endian 방식이라고 하며 인텔에서 쓰고 있는 방식(x86계열)이다.
반대로는 Big Endian 이 있다.

Little Endian 은 Big Endian에 비해서 산술연산이 빠르고 반면 Big Endian은 논리연산에 유리하다.(대소비교가 빠르다)

비트수가 짝수인데 CPU가 2진수로 2의 배수에 특화 되어있기 때문이다.



부호확장


char A = -1;
char B = 0xFF;
char C = 255;

int D = C;
unsigned int E = C;


C를 출력해보면 -1이 나온다.
char C = 255 에 비트를 보면
 1  1  1  1  1  1  1  1

이다 기본적으로 signed 형이기 때문에 -1이 된다.
1바이트를 4바이트에 넣는 경우인데 제일 앞 비트가 1이므로 음수로 치고 1을 앞비트에 다붙인다.
 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
32칸 전부가 1이 되기때문에 -1이 출력되는 것이다.

이것을 signed 부호확장이라고 한다

unsigned int E = C; 도 E를 출력해보면 애초에 C가 signed 형이기때문에 signed 부호확장이 일어나 -1이 된다.

#include <stdio.h>

int main()
{
  short A=0x7788;
  unsigned char *B=(unsigned char*)&A;
  
  printf("%02x\n",*B);  
  ++B;
  printf("%x\n",*B);  
  
  return 0;
}

88은

 1  0  0  0  1  0  0  0

젤 앞비트가 1이므로 signed 부호확장이 일어나고


77은
 0  1  1  1  0  1  1  1

제일 앞이 0이다 0일때는 나머지 비트에 0이 들어가는데 이것을 제로확장 이라고 한다.
*unsigned int D= char C;
형변환이 일어나는데 형변환의 순서는 1바이트를(char)먼저 4바이트로 변화 시키고 int D에 대입하는 순서로 한다.
CPU에서 변환을 시키게 되는데 그때에 원본의 형을 따라서 변환이 일어난다(signed 나 unsigned)

원본의 형이 signed 면 부호확장 unsigned면 제로확장이 일어나게 된다.






'보고서 > 10월 업무일지' 카테고리의 다른 글

10월 19일 업무일지  (0) 2010.10.19
10월 18일 업무일지  (0) 2010.10.18
10월 13일 업무일지  (0) 2010.10.13
10월 12일 업무일지  (0) 2010.10.12
10월 11일 업무일지  (0) 2010.10.11