20140319 (포인터, little endian, big endian, 포인터 연산)

23일차

 

______________

포    인    터

--------------

- 어제 이어 계속 포인터

포인터의 크기는 4byte이다.

포인터는 메모리의 주소를 저장하고 있기 때문에

메모리의 크기 만큼만 크기가 되면 된다.

32bit 컴퓨터에 메모리의 최대 크기가 약 4G가 최고이니

그에 맞게 32bit -> 4byte 이다.

 

만약 64bit 컴퓨터라면 아마 8byte가 되겠지..?

확인해 봐야 한다고 배웠다.

 

 

 

----------------------------

little endian, big endian

----------------------------

- CPU 마다 메모리 저장 방식이 다른데

little endian방식과 big endian방식이 있다.

 

설명을 위해 예제를 보자.

 

위와 같이 1byte크기로 거꾸로 저장되고 있었다.

intel 같은 경우는 산술을 빨리 하기 위해서 거꾸로 저장된다고 한다.

덧셈을 할 경우

이런 식으로 메모리에서 불러와 연산할 때에 셈이 더 빨라지므로

거꾸로 저장한다.

앞에서 언급했듯이 저장 방식이 두 가지가 있다.

 

- Little Endian

intel 같은 pc용으로 쓰이는 CPU는 little endian이다

메모리에 저장될 때 거꾸로 저장된다.

산술↑    대소비교↓

pc 같은 경우 데이터 처리, 게임 같이 산술을 많이 해서

거꾸로 저장하는게 유리하다고 한다.

 

- Big Endian

super 컴퓨터 같은 것 들은 big endian방식을 쓴다

메모리에 저장될 때 그대로 저장된다.

산술↓    대소비교↑

대소비교 같은 경우 맨 앞자리 부터 비교하면 어떤 수가 더 큰지

빨리 볼 수 있으므로 그대로 저장하기 때문에

대소비교시 더 빠르다고 한다.

 

 

------------------------

포  인  터  연  산

------------------------

- 포인터를 연산?

ex) 예제 소스

#include <stdio.h>

int main()
{
  int  iNum = 0x12345678;
  unsigned  char *cp = (unsigned char *)&iNum;
  short *  sp = (short *)&iNum;

  *cp = 0xAA;

  printf("0x%08X \n", iNum);

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

  printf("%08X \n", (cp+0) );
  printf("%08X \n", (cp+1) );
  printf("%08X \n", (cp+2) );
  printf("%08X \n", (cp+3) );

  printf("%04X \n", *(sp+0) );
  printf("%04X \n", *(sp+1) );

  printf("%08X \n", (sp+0) );
  printf("%08X \n", (sp+1) );

  return 0;
}

출력 화면

 

위에서 보듯이 주소에 수를 더하면 그 타입의 크기만큼 증가한다.

증감을 통해 메모리 주소를 왔다갔다 할 수있다.

 

 

- 또 한가지 주의 할 것이 있다.

아래 소스를 보자

#include <stdio.h>

int main()
{
  int    iNum = 0x12345678;
  char *    cpNum1 = (char *)&iNum;
  unsigned char *  cpNum2 = (unsigned char *)&iNum;

  *cpNum1 = 0xAA;

  printf("iNum = %08X \n", iNum);

  printf("*cpNum1 = %X \n", *cpNum1);

  printf("*cpNum2 = %X \n", *cpNum2);

  return 0;
}

출력 화면

 

출력 화면을 보듯

cpu에서 char 형도 정수로 보기 때문에 1010이 저장되었으므로

맨 앞이 음수이다. 그래서 register에서 받았을 경우 남는 칸도

다 111111111로 채우기 때문에 FFFFFFAA로 나온다

반면에 unsigned char는 양수형 정수이기 때문에 그대로 나온다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

설정

트랙백

댓글