2012년 10월 3일 수요일

자료형의 자동 형 변환

자료형 변환이란 말 그대로 데이터의 표현방식을 바꾸는 것(int,double등)입니다.

자료형 변환에대해 알아봅시다!

1.자료전달오류로 인한 자동 형 변환

ex1)
double tender1 = 1;

double함수 인데 왜 1을 초기화했냐는 의문들이 있을 것입니다. 하지만, 이것은 자동 형 변환한 것으로 정수1을 double함수로 저장한 것입니다.

실험을 해보겠습니다.

변수 tender는 double형이기 때문에 %f를 써줘야만 합니다.


출력은 어떻게 되느냐? 위처럼 1이란 정수는 소수점이 붙어 1.00000으로 저장되어 출력됩니다.

또 다른 예를 보겠다.

ex2)
int tender2 = 1.323;

int함수에 실수를 저장해 자동 형 변환한 것입니다.

실험을 해보겠습니다.
변수 tender는 int형이기 때문에 %d를 써준다.



출력은 1이 된다.(이는 실수형 상수의 손실이 된다. 소수점파괴)

ex3)
int tender = 129;
char char1 = tender3;

이 예제는 int형 변수 tender값을 char형으로 자동 형 변환한 것입니다.

맨처음에 저장한 변수는 4바이트지만 다음줄에 char에 저장했기때문에, 1바이트로 바뀌어야 한다. 그래서 앞에 3칸의 비트를 제거하고 10000001이 됩니다.


결과는 -127
이 과정이 이해가 안가시는 분들은 이 링크타고 가세요.


2.정수의 승격(빠른 계산을 하기 위한 형 변환)

여태까지한 자동 형 변환은 전달과정에서난 오류때문에 변환 된 것들이고, 이번엔 계산에 의해서 형 변환이 되는 예를 들어보겠습니다.

그런데, 계산에 의해서 형 변환이 되는 것을 "정수의 승격"이라고 약속을 했다고 하네요.

예제를 보겠습니다.

ex)
int main(void)
{
short tender=30, tender1=40;
short tender2= tender+tender1; //이 과정에서 tender1+tender2가 int형으로 변환된다.
}

실험으로 자세하게 알아보겠습니다.

tender+tender1은 4바이트로 정수의 승격이 되지만 tender2는 초기화했기때문에, 2바이트가 된다는 것이 위에서 말한 내용입니다.

결과는 예상대로 4바이트와 2바이트가 나왔습니다.

변수 텐더1과 텐더2를 더하는 연산은 전 포스트에서 말했듯이, 정수의 연산은 int형이 제일 빠르기 때문에 tender+tender1의 사이즈값은 4바이트로 "정수의 승격"이 됩니다.



3.자료형이 일치하지않아서 생기는 자동 형 변환

이 변환은 자료형은 double인데 연산은 정수와 실수로 구성되어 생기는 변환으로 보통 이상황에서는 int형 정수를 double형 실수로 변환을 하는 것입니다. 왜 더블형 실수로만 바뀌냐면 더블형 실수가 인트형 정수로 바뀌어서 계산되면 소수점이 데이터손실로 없어지기 때문에, 더블형 실수로 바뀌어서 계산된다고 합니다.

실험으로 자세히 알아보겠습니다.

변수 텐더는 더블형이므로 3과 1.9는 둘 다 더블형 실수로 변환된다고 예상을 해봅니다.

결과는 예상대로 인트형 정수3이 더블형 실수3.000000로 변환되어 계산됐습니다.

결론은 두 상수의 연산의 자료형이 일치하지 않아서 바뀌는 변환은 데이터손실이 최대한 줄이는 방향으로 진행됩니다.



4.명시적 형 변환: 강제로 변환

이 변환은 먼저 실험으로 알아보고서 이해하는게 좋을 것 같아 실험을 해보겠습니다.

변수 result는 0.66...이 나와야합니다.

하지만 결과는 0으로 나옵니다.
왜냐하면 텐더값이 인트이기 때문인 것입니다.


그러면 여기서. 소괄호를 넣어줍니다.

소괄호는 수학에서 연산을 빨리하는것에 쓰이기도 하지만, C언어에서는 형 변환에도 씁니다. 아무튼 이렇게 써주면 결과는 예상대로 0.6666이 나와야하죠?

결과는 이렇게 나옵니다. 왜 맨뒤에는 7이냐구요? 반올림했기 때문입니다.


이렇게해서 형 변환포스트가 끝났습니다. 수고하셨습니다.

댓글 없음:

댓글 쓰기