sizeof 연산자는 어떤 자료형을 리턴하는지에 대한 이야기다.
C언어 책의 자료형을 배우다 보면 아래와 같은 단골 예제가 나온다.
#include <stdio.h>
int main(void)
{
char sch = '1';
printf("%d\n", sizeof(sch));
return 0;
}
그리고 아래와 같은 경고 메시지를 만나게 된다.
main.c:8:20: warning: format specifies type 'int' but the argument has type 'unsigned long' [-Wformat]
printf("%d\n", sizeof(sch));
~~ ^~~
%lu
1 warning generated.
1
분명 학교에서 C언어를 배울 당시에는 위와 같은 경고 메시지를 보진 못했던 것 같은데......
컴파일러에 따라 결과가 달라질 수 있고, 운영체제가 64bit 를 지원하느냐, 기존의 32bit를 지원하느냐에 따라 (즉, 사용자의 machine에 따라) 컴파일러가 다른 결과를 리턴한다고 한다.
스택오버플로우에서는
%d
포맷을 사용해도 괜찮다. 그러니 경고는 무시해도 된다 라는 의견도 있다.
sizeof operator in C에서는
"The result of sizeof is of unsigned integral type which is usually denoted by size_t."
이해가 갔다.
변수나 상수 또는 자료형의 크기를 리턴하는 연산자가 음수를 리턴할 필요가 있을까
맥 기반 VCC에서의 컴파일러는
sizeof 연산자의 리턴값은 unsigned long으로, 정수형 8바이트의 크기를 갖는 값을 저장할 수 있다고 말하고 있다.
specifies type 'int' but the argument has type 'unsigned long' [-Wformat]
#include <stdio.h>
int main()
{
// %lu 포맷 사용
printf("%lu\n", sizeof(char));
printf("%lu\n", sizeof(int));
printf("%lu\n", sizeof(float));
printf("%lu\n", sizeof(double));
return 0;
}
참고자료
https://stackoverflow.com/questions/3209909/how-to-printf-unsigned-long-in-c
감사합니다. lu형으로 하니까 경고없이 출력되는데 %d 로 하니 경고가 뜨고 출력이 되네요.