int main()
{
double i=4;
printf("%d",i);
return 0;
}
Can anybody tell me why this program gives output of 0?
int main()
{
double i=4;
printf("%d",i);
return 0;
}
Can anybody tell me why this program gives output of 0?
Because i is a double and you tell printf to use it as if it were an int (%d).
%d is for integers:
Because
"%d"
specifies that you want to print anint
, buti
is adouble
. Tryprintf("%f\n");
instead (the\n
specifies a new-line character).The simple answer to your question is, as others have said, that you're telling
printf
to print a integer number (for example a variable of the typeint
) whilst passing it a double-precision number (as your variable is of the typedouble
), which is wrong.Here's a snippet from the
printf(3)
linux programmer's manual explaining the%d
and%f
conversion specifiers:To make your current code work, you can do two things. The first alternative has already been suggested - substitute
%d
with%f
.The other thing you can do is to cast your
double
to anint
, like this:printf("%d", (int) i);
The more complex answer(addressing why
printf
acts like it does) was just answered briefly by Jon Purdy. For a more in-depth explanation, have a look at the wikipedia article relating to floating point arithmetic and double precision.Because the language allows you to screw up and you happily do it.
More specifically, '%d' is the formatting for an int and therefore printf("%d") consumes as many bytes from the arguments as an int takes. But a double is much larger, so printf only gets a bunch of zeros. Use '%lf'.
When you create a
double
initialised with the value4
, its 64 bits are filled according to the IEEE-754 standard for double-precision floating-point numbers. A float is divided into three parts: a sign, an exponent, and a fraction (also known as a significand, coefficient, or mantissa). The sign is one bit and denotes whether the number is positive or negative. The sizes of the other fields depend on the size of the number. To decode the number, the following formula is used:1.Fraction × 2Exponent - 1023
In your example, the sign bit is 0 because the number is positive, the fractional part is 0 because the number is initialised as an integer, and the exponent part contains the value
1025
(2 with an offset of 1023). The result is:1.0 × 22
Or, as you would expect,
4
. The binary representation of the number (divided into sections) looks like this:Or, in hexadecimal,
0x4010000000000000
. When passing a value toprintf
using the%d
specifier, it attempts to readsizeof(int)
bytes from the parameters you passed to it. In your case,sizeof(int)
is4
, or 32 bits. Since the first (rightmost) 32 bits of the 64-bit floating-point number you supply are all0
, it stands to reason thatprintf
produces0
as its integer output. If you were to write:Then you might get
0 1074790400
, where the second number is equivalent to0x40100000
. I hope you see why this happens. Other answers have already given the fix for this: use the%f
format specifier andprintf
will correctly accept yourdouble
.