블로그 이미지
JoyfulLife

공지사항

최근에 받은 트랙백

글 보관함

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
31            

교육1일차

2011.08.23 21:20 | Posted by JoyfulLife
형변환
형변환은 조금은 생각해봐야 할 문제이다.
char a;
int b=(int)a;

모 이런 식으로 해줄 수 있다. char 형은 1byte 이고 int는 4byte를 보통 많이 쓴다. 만약 a의 값이 0xff 라면 (int)a라고 했을 때 어떤 형식으로 될까?
0으로 채울 것이다.

다음으로 unsigned 와 singed 를 생각해봐야 한다.

unsigned char a=0x80;

printf("%u",a)
printf(%d",a)
는 어떤 차이를 보일까?

%u 는 인자를 unsigned int 로 간주를 한다.
%d는 signed int 로 간주를 한다.

답은 %d는 마이너스 값이 나올 것이다.


unsigned char a=0xff;

a==0xff 는 참일까? 거짓일까?

이걸 볼려면 비교되는 데이타 타입을 생각해야 한다. 데이타 타입이 같아야 비교가 가능하다.
0xff는 사실 0x000000ff 이다. 4바이트 인트형이니깐..
당연히 답은 참이다.

signed char a=0xff;
a==0xff 는 어떨까?
a는 무엇으로 변환이 될까? a는 -1 이다. 이걸 int형으로 변환하면 -1로 변환이 되는 것이다. 왜냐하면 signed이니깐..

데이터 타입을 맞추지 않은 사칙연산을 생각해보자.

int a; unsigned int b; char c;
a=c+b;

는 어떻게 될까? 이것은 c-> UI, c+b-> SI로 컴파일러가 자동으로 변환을 한다. 아마 경고문구는 나올 것이다.


float pi=3.14;

pi==3.14
는 참일까? 거짓일까?

3.14는 더블형이다. pi는 float 형이다. 이건 형변환이 일어난다고 해도 거짓일 것이다. 정확하게는 3.14가 2진수로 어떻게 표현이 되는지 생각해봐야 할 것이다. 3.14는 정확한 이진수가 안 나온다. 그래서 pi는 4바이트 double은 8바이트로 double 쪽에서 짤린다. 거기다가 floast 형과
double은 표현 방법은 달라서 float으로 실수를 표현하는 것은 안 좋다는 말이 많다.


다음은 static을 생각해보자.

static int a;
형은 a의 데이터가 stack에 저장되지 않고 memory에 저장이 된다.
이제는 변수가 어떻게 저장이 되는지도 생각해야 한다.


void main()
{
  f1();
  f1();
}
void f1()
{
   static int s=1;
   s++;
}
여기서 중요하게 생각해봐야 할 점은 static int s 이다.
s를 두 번 선언하는 것 같이 보인다. 하지만 컴파일러가 컴파일 할 때 static 을 보고 미리 메모리에 영역을 잡아 버린다. 따라서 실행될 때 선언되지 않고 가져다 쓰기만 한다.




c언어를 가볍게 생각을 했는데 메모리 부분까지 생각해봐야 하는 것 같다.


 
신고

'C언어' 카테고리의 다른 글

교육3일차  (0) 2011.08.25
교육2일차  (0) 2011.08.23
교육1일차  (0) 2011.08.23
포인터  (0) 2010.07.15
TAG
이전 1 2 3 4 5 6 7 8 ··· 91 다음

티스토리 툴바