#include <stdio.h>
int main(void)
{
short i = 1;
printf("%hd\n", i);
printf("%hd\n", i * i);
return 0;
}
Compiling this gives the warning warning: format specifies type 'short' but the argument has type 'int' [-Wformat] printf("%hd\n", i * i);
.
Removing the printf("%hd\n", i * i);
statement produces no warning.
Have I done something wrong? It is my understanding that since i
has type short int
that the value of the expression i * i
has type short int
but then printf
performs an integer promotion to convert this short int
result to int
form before converting this int
to short
again (due to the conversion specifier).
I don't particularly see what is wrong about the code though. Is it just a warning telling me to be careful of the possibility that a more complicated expression than a simple short int
variable being passed as an argument to printf
corresponding to the %hd
conversion specifier might result in overflow? Thanks!