블로그 이미지
송시혁

calendar

1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30

Notice

Tag

Recent Post

Recent Comment

Recent Trackback

Archive

 

 

#include <stdio.h>
int main()
{
  int inum;
  int icnt;
  
  char *cp;  
  cp = (char*)&inum;


  inum = 0x7788aabb;
  printf("%02X ", *cp);
  printf("%d 0xFFFFFFBB\n", *cp);
  
  
/*printf("%02X ", *(cp+0));
  printf("%02X ", *(cp+1));
  printf("%02X ", *(cp+2));
  printf("%02X ", *(cp+3));*/ 순서대로

FFFFFFBB, FFFFFF AA, FFFFFF88, 77이 나온다.
  
  for(icnt =0; icnt<4; icnt++)
  {
    printf("%02X ", *(cp + icnt));
  }

  return 0;
}


*cp는 char형 포인터 변수로 선언하여 inum의 값의 1바이트값인 BB를 갖는다.

%02x는 두자리수를 나타내야 하는데 FFFFFFBB 8자리가 나타난다.

cpu상의 값은 FF FF FF BB인데 BB앞에 F를 1로 인식한다. 그래서 컴퓨터는

앞에 숫자가 있다고 판단하여 8자리까지  모두 나타내고 있다.

BB = -69, 계산기로 69의 2의 보수를 취하면 나온다.

원래7788AABB를 포인트 변수 cp형 1byte크기로 BB. 그것을

for문으로 포인터 변수 cp에 icnt를 1씩 더하여 값을 나타냈다.

BB(cp +0), AA(cp+1), 88(cp+2), 77(cp+3), char는 1byte형식

이라서 1칸씩 이동하는 것을 알 수 있다.

그래서 각각 FFFFFFBB, FFFFFFAA, FFFFFF88, 77이 나왔다.

signed는 범위가 -127~127까지이므로 77은 십진수로 119라서  제대로 인식하지만

나머지 BB같은경우는 십진수로 unsigned 같은 경우 187,

signed같은 경우 -69가 된다.

 그러나 cpu는 4byte형태로 저장이 되므로 BB앞에 음수로 인식하여

 빈자리를 채우는데 FFFFFFBB가 뜬다.

양의 정수라면 000000BB가 되어 BB만 출력이 된다.

 

 

unsigned를 쓴다면 제대로 출력이 가능하다.

unsigned char *cp;

cp = (unsigned*)ip; 로 수정한다. 그러면, ip의 포인터값인

inum = 0x7788AABB를 양의 정수로 인식해서 야래와 같이 

 BB, AA ,88,77이 나온다.

 

posted by 송시혁