2013. 4. 3. 16:57ㆍ프로그래밍/C언어 TIP
◈ 변수의 값과 주소
변수에는 항상 주소 값이 존재한다. 그 주소 값을 알아 보기 위해 다음과 같은 소스를 이용한다.
&x로 변수 x가 할당 받은 변수의 메모리 주소를 받아 오게 된다. 형식지정자 %p로 주소를 출력하게 되는 것이다. 다음과 같은 결과 창으로 확인해보자.
변수 x에는 25가 들어가 있고 그 25가 들어 있는 변수 x의 주소는 0xbffff9d8이 되는 것이다.
◈ 포인터의 개념
포인터변수는 메모리의 주소를 값으로 가지는 변수로 프로그램에서 메모리에 직접 접근할 때 사용한다. 한마디로 주소를 저장하기 위한 자료형이라고 한다.포인터 변수는 타입에 관계없이 주소저장을 위해 4byte를 사용한다. 포인터 변수 4byte는 Bus의 크기에 의해 좌우된다. Bus의 크기가 8byte가 되면 포인터 변수 역시 8byte를 사용하게 되는 것이다.
int형의 포인터 변수는 다음과 같이 선언한다.
포인트변수를 이해하기 위해 아래와 같은 상황을 만들어 보자.
위의 그림처럼 캐스팅을 사용하게 되면 경고메세지도 뜨지 않게 된다.
아래 소스를 통해 직접 어떠한 경고메세지가 뜨는지 확인해보자.
◈ little endian
little endian은 하위 바이트의 값이 메모리상에 먼저 표시되는 방법이다. 이러한 방법은 산술연산이 빠르다는 장점을 가진다. lntel x86계열은 Little-Endian 방식을 사용한다.
1byte char형과 2byte short형은 Little endian방식으로 저장되지 않지만, 4byte int형과 long형은 Little endian 방식으로 메모리에 저장된다. 실수는 어떻게 저장될까?
다음 소스를 출력하면
이러한 결과가 나오게 된다. IEEE754를 이용하여 실제로 메모리에 어떻게 저장되는지를 알아보자.
실수 5.765는 5와 0.765를 분리한다. 5는 2진수로 101이 나오게 되고 0.765는 2를 계속 곱하는 방식으로 1.0이 넘어가면 1을 뺀 수에 다시 2를 곱하고 1.0이 넘어가지 않으면 0이 되는 방식으로 2진수를 구한다.
위와 같은 방법으로 21비트까지 계산을 해주면,
0.765는 2진수로 110000111101011100001이 된다. 앞에 계산한 5의 2진수와 함께 써주면
101.110000111101011100001이 만들어 지게 된다. 여기서 1.xxx의 방식으로 만들기 위해 소수점을 앞으로 두 칸 이동시키면 1.01110000111101011100001 * 2^2이 된다. 맨 앞에 1은 버리면 남아있는 가수부가 된다.
지수부는 2^2의 승수 2를 바이어스값 127과 더하여 129를 만들고 그 값을 2진수로 만들면
1000 0001이 만들어 지게 된다. 맨 앞에 부호비트는 전체의 값이 양수이기 때문에 0을 적어주게 되면
0100 0000 1011 1000 0111 1010 1110 0001이 만들어 진다. 이 2진수를 16진수로 변환하면
40 B8 7A E1이 되는데 아까 출력된 값과 반대로 나오게 된다. 이로써 실수도 Little endian방식을 사용하여 메모리에 저장한다는 사실을 알 수 있게 되는 것이다.
'프로그래밍 > C언어 TIP' 카테고리의 다른 글
201303/ 포인터 주소 값의 연산. 함수의 원형. 함수의 정의 (0) | 2013.04.03 |
---|---|
201303/포인터의 이해 (0) | 2013.04.03 |
201303/ getchar()와 getch() (0) | 2013.04.03 |
201303/for문 (0) | 2013.04.03 |
201303/while문. 심볼테이블. gerch() (0) | 2013.04.03 |