' [C/C++] 6.1강 - C언어에서 형변환 하기(리터럴 접미사)

Programming/C & C++

[C/C++] 6.1강 - C언어에서 형변환 하기(리터럴 접미사)

mdisprgm 2021. 6. 16. 01:22
728x90

지난 포스팅에서

 

변수들을 형변환하는 법을 설명했다.

 

그런데 C에서는 기본적인 숫자 자체(literal)를

 

형변환 하는 경우에는 더 편리하게 변환할 수 있는 수단이 있다.

 

바로 리터럴 접미사를 붙이는 것이다.

 

(1) 리터럴 접미사

C에서는 

 

기본적으로 정수형, 실수형은 특별히 지정해준 타입이 없을 경우(접미사를 생략할 경우)

 

자동을 각각 int, double로 인식한다. (컴파일러마다 다를 수도)

 

그리고 대부분의 경우 이것이 큰 문제가 되지 않지만

 

일부 특수한 경우에서는

 

이것들을 다 구분해주어야 (short, int, long long | float, double)

 

하는 경우가 생길 수 있다.

 

그런데 사실 매번

 

(타입이름)

 

이렇게 적기에는 번거로웠는지

 

편의 문법들이 생겼다.

 

 

숫자 뒤에 리터럴 접미사(suffix)를 붙여주는 방식인데

 

여러 자료형들도 결국엔 정수/실수 두 부류로 나뉘는데

 

이에 따라 접미사들도 정수형, 실수형을 위한 접미사가 따로 존재한다.

 

1. 정수형 접미사들 : U, L, LL, UL, ULL ...

 

2. 실수형 접미사들 : F, L

 

각각의 용도는 아래와 같다.

 

정수형 접미사 )

접미사 자료형
u, U unsigned
l, L long
ll, LL long long
ul, UL unsigned long
ull, ULL unsigned long long

 

실수형 접미사 )

접미사 자료형
f, F float
l, L long double

 

ex)

float a = 3.14f;

int b = 1206LL;

 

위에서

3.14f는 double이 아닌 float으로 생성된 리터럴이 a에 대입됐다.

1206은 int가 아닌 long long으로 생성된 리터럴이 b에 대입됐다.

 

 

주의할 점은 실수형 접미사에서 L이 의미하는 long doubledouble은 다른 자료형이라는 점,

 

그리고 정수형에 붙이는 L과 실수형에 붙이는 L이 서로 다르게 작동한다는 점이다.

 

정수형에서는 L이 long 타입이지만, 실수형에서는 L이 long double로서 작동한다.

 

 

(2) 정수형 접미사

이게 실제로 바뀐 건지 아닌지 굳-이 눈으로 확인해보고 싶다면

 

sizeof 연산자를 사용하면 된다.

 

sizeof는 자료형 뿐만 아니라 변수나 상수를 넣었을 때 그 값의 자료형의 크기를 반환한다.

 

이것으로 입력한 값이 어떤 타입인지를 유추할 수 있다.

접미사는 소문자, 대문자 모두 가능하지만 한번에 하나로 통일해야 한다.

 

이렇게 위에서부터 차례대로

 

sizeof(int), sizeof(unsigned int), sizeof(long), sizeof(long long), sizeof(unsigned long long)이 출력됐다.

 

signed - unsigned 간의 sizeof의 차이는 없으니까

 

위에서부터

4, 4, 4, 8, 8 이 출력돼야 하고, 그렇게 잘 나왔다.

 

같은 12라는 정수 값이 접미사에 따라 그 자료형이 달라진 것이다.

 

 

참고로 sizeof의 결과는 컴파일러마다 다를 수 있다.

 

이것은 GCC라는 오픈 소스 컴파일러를 사용하는 온라인 컴파일러에서 실행한 결과인데

 

보다시피 long의 크기가 Visual Studio에서 4와 다르게 8로 나온다.

 

* %ld를 쓴 이유는 저 컴파일러에서 sizeof는 long타입으로 반환하기 때문이다. (경고 메시지를 없애기 위해)

 

(3) 실수형 접미사

실수형은 지난 강좌와 아주 비슷한 예제를 사용하는데

 

지난 강좌를 읽지 않았다면 예제만라도 읽어보길 바란다.

(여기서는 자세한 설명을 생략)

 

이 코드를 보면

 

정수 25와 정수 10을 나누려고 했다.

 

정말 그런가?

 

아니다, 이 코드는 정수 25와 실수 10을 나누는 코드이다.

 

왜냐하면 소수점을 .0이라도 적어주었기 때문에 저것은 실수형 double이 된다.

 

따라서 sizeof(10.0);을 출력해보면 8이 나온다..

 

실수형 역시 정수처럼

 

접미사를 붙여 다른 실수형으로 변환할 수 있다.

 

float으로 변환할 경우에는 접미사 f만 붙이면 된다.

그럼 이렇게 4로 출력이 되죠.

 

int a = 25;

printf("%d / %f = %f\n", a, 10.0f, a / 10.f);	//꼭 소수점을 쓸 필요는 없고
						//이렇게 소수점 부분이 0이라면 f만 붙여도 됨

 

다음은 접미사 L을 붙여서 long double로 변환을 하는 코드이다. 

 

아까도 사용한 온라인 컴파일러에서는

 

long double의 sizeof가 16으로 나온다.

컴파일러마다 size는 다를 수 있다는 것이다

하지만 Visual Studio에서는?

 

8로 나온다.

 

일부 타입들은 컴파일러마다 그 size가 다를 수 있다는 걸 알 수 있다.

 

 

+++++++++++

Visual Studio에서 각 자료형마다의 크기를 확인해보았다. 

#include <stdio.h>

int main() {
	printf("sizeof(int) : \t\t\t%d\n", sizeof(int));//생략
	printf("------------------------------------\n");
	printf("sizeof(long) : \t\t\t%d\n", sizeof(long));//l
	printf("------------------------------------\n");
	printf("sizeof(long long) : \t\t%d\n", sizeof(long long));//ll
	printf("------------------------------------\n");
	printf("sizeof(unsigned long long) : \t%d\n", sizeof(unsigned long long));//ull
	printf("------------------------------------\n");
	printf("sizeof(float) : \t\t%d\n", sizeof(float));//f
	printf("------------------------------------\n");
	printf("sizeof(double) : \t\t%d\n", sizeof(double));//생략
	printf("------------------------------------\n");
	printf("sizeof(long double) : \t\t%d\n", sizeof(long double));//l
	printf("------------------------------------\n");
}

 

실행 결과 :

 

 

 

끝.

728x90

'