468,457 Members | 1,590 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 468,457 developers. It's quick & easy.

printf("%f") question

If we want to print a float with printf, a printf("%f", x); is
sufficient, or a cast is needed like in printf("%f", (double)x); ?
Mar 2 '08 #1
13 6140
Clarification: The question is about C90/C95.

Ioannis Vranos wrote:
If we want to print a float with printf, a printf("%f", x); is
sufficient, or a cast is needed like in printf("%f", (double)x); ?
Mar 2 '08 #2
On Sun, 02 Mar 2008 15:16:11 +0200, Ioannis Vranos wrote:
If we want to print a float with printf, a printf("%f", x); is
sufficient, or a cast is needed like in printf("%f", (double)x); ?
Any float argument to the variable arguments of a function will be
promoted to double. Both are fine.
Mar 2 '08 #3
Harald van Dijk wrote:
Any float argument to the variable arguments of a function will be
promoted to double. Both are fine.

I suppose the following are also correct:

signed char sc= 15;
unsigned char uc= 130;

printf("%d\t%hu\t%u", sc, uc, uc);
Mar 2 '08 #4
On Sun, 02 Mar 2008 15:39:42 +0200, Ioannis Vranos wrote:
Harald van Dijk wrote:
>Any float argument to the variable arguments of a function will be
promoted to double. Both are fine.

I suppose the following are also correct:

signed char sc= 15;
unsigned char uc= 130;

printf("%d\t%hu\t%u", sc, uc, uc);
On most systems, unsigned char will be promoted to signed int, which
should be printed using %d. You can usually -- probably on all existing
implementations -- get away with printing a signed int using %u, or an
unsigned int using %d, so long as the value is within the common range,
but it's not correct.
Mar 2 '08 #5
Ioannis Vranos wrote:
If we want to print a float with printf, a printf("%f", x); is
sufficient, or a cast is needed like in printf("%f", (double)x); ?
x will be promoted to a double, following the normal promotion rules for
arguments. The cast is unnecessary.
Mar 2 '08 #6
Harald van Dijk <tr*****@gmail.comwrites:
On Sun, 02 Mar 2008 15:39:42 +0200, Ioannis Vranos wrote:
>Harald van Dijk wrote:
>>Any float argument to the variable arguments of a function will be
promoted to double. Both are fine.

I suppose the following are also correct:

signed char sc= 15;
unsigned char uc= 130;

printf("%d\t%hu\t%u", sc, uc, uc);

On most systems, unsigned char will be promoted to signed int, which
should be printed using %d. You can usually -- probably on all existing
implementations -- get away with printing a signed int using %u, or an
unsigned int using %d, so long as the value is within the common range,
but it's not correct.
signed char definitely promotes to (signed) int, so the "%d" is ok.

The "%hu" should be "%hhu" ("%hu" is for unsigned short). The "%hhu"
format prints a value of type unsigned char; "the argument will have
been promoted according to the integer promotions, but its value shall
be converted to signed char or unsigned char before printing" (C99
7.19.6.1p7). That's exactly what "%hhu" is for.

Harald is correct about the "%u" format; "%hhu" is better than "%u",
even though "%u" is very likely to work as expected.

--
Keith Thompson (The_Other_Keith) <ks***@mib.org>
Nokia
"We must do something. This is something. Therefore, we must do this."
-- Antony Jay and Jonathan Lynn, "Yes Minister"
Mar 2 '08 #7
Keith Thompson wrote:
Harald van Dijk <tr*****@gmail.comwrites:
>On Sun, 02 Mar 2008 15:39:42 +0200, Ioannis Vranos wrote:
>>Harald van Dijk wrote:
Any float argument to the variable arguments of a function will be
promoted to double. Both are fine.
I suppose the following are also correct:

signed char sc= 15;
unsigned char uc= 130;

printf("%d\t%hu\t%u", sc, uc, uc);
On most systems, unsigned char will be promoted to signed int, which
should be printed using %d. You can usually -- probably on all existing
implementations -- get away with printing a signed int using %u, or an
unsigned int using %d, so long as the value is within the common range,
but it's not correct.

signed char definitely promotes to (signed) int, so the "%d" is ok.

The "%hu" should be "%hhu" ("%hu" is for unsigned short). The "%hhu"
format prints a value of type unsigned char; "the argument will have
been promoted according to the integer promotions, but its value shall
be converted to signed char or unsigned char before printing" (C99
7.19.6.1p7). That's exactly what "%hhu" is for.

Harald is correct about the "%u" format; "%hhu" is better than "%u",
even though "%u" is very likely to work as expected.

Thanks for the answer, I forgot to mention that I am talking about
C90/C95 here.
Mar 2 '08 #8
Ioannis Vranos wrote:
Keith Thompson wrote:
>Harald van Dijk <tr*****@gmail.comwrites:
>>On Sun, 02 Mar 2008 15:39:42 +0200, Ioannis Vranos wrote:
Harald van Dijk wrote:
Any float argument to the variable arguments of a function will be
promoted to double. Both are fine.
I suppose the following are also correct:

signed char sc= 15;
unsigned char uc= 130;

printf("%d\t%hu\t%u", sc, uc, uc);
On most systems, unsigned char will be promoted to signed int, which
should be printed using %d. You can usually -- probably on all
existing implementations -- get away with printing a signed int
using %u, or an unsigned int using %d, so long as the value is
within the common range, but it's not correct.

signed char definitely promotes to (signed) int, so the "%d" is ok.

The "%hu" should be "%hhu" ("%hu" is for unsigned short). The "%hhu"
format prints a value of type unsigned char; "the argument will have
been promoted according to the integer promotions, but its value
shall be converted to signed char or unsigned char before printing"
(C99
7.19.6.1p7). That's exactly what "%hhu" is for.

Harald is correct about the "%u" format; "%hhu" is better than "%u",
even though "%u" is very likely to work as expected.


Thanks for the answer, I forgot to mention that I am talking about
C90/C95 here.
In which case you'll have to use %u.

Mar 2 '08 #9
santosh wrote:
>
>Thanks for the answer, I forgot to mention that I am talking about
C90/C95 here.

In which case you'll have to use %u.

Thanks for the answer. So, if I want to print the numeric value of an
unsigned char , can I use printf("%u") without a cast?

Mar 2 '08 #10
ym******@gmail.com wrote:
>
Are you kidding? A resolved DR would be a conclusion, otherwise
you read what people say and either agree or disagree. I personally
stick to the following: it's UB, but works fine here (where "here"
is "everywhere").

Well, I think casting the value to the expected type by the printf(), is
the safest solution.
Mar 2 '08 #11
On Mar 3, 8:30*am, Ioannis Vranos wrote:
... So, if I want to print the numeric value of an
unsigned char , can I use printf("%u") without a
cast?
Certainly...

unsigned char uc;
printf("%u", 0u + uc);

--
Peter
Mar 3 '08 #12
Peter Nilsson wrote:
On Mar 3, 8:30 am, Ioannis Vranos wrote:
>... So, if I want to print the numeric value of an
unsigned char , can I use printf("%u") without a
cast?

Certainly...

unsigned char uc;
printf("%u", 0u + uc);

I mean with the unsigned char variable alone, not with an interaction
with an unsigned int constant or variable.
Mar 3 '08 #13
Ioannis Vranos <ivra...@nospam.no.spamfreemail.grwrote:
Peter Nilsson wrote:
On Mar 3, 8:30 am, Ioannis Vranos wrote:
... So, if I want to print the numeric value of an
unsigned char , can I use printf("%u") without a
cast?
* unsigned char uc;
* printf("%u", 0u + uc);

I mean with the unsigned char variable alone,
It's my opinion that the literal wording of the standard
differs from the stated intent for both C90/95 and C99.
The intent is that a common value to both should work as
an argument to either signed/unsigned version of an
integer rank.

However, the standard clearly ambiguates this, if not
actually precludes it, in many places. For instance,
va_arg() is required to work this way, but fprintf isn't
required to use va_arg().

The point is, if you want to be pedantic, then play it
safe.
not with an interaction with an unsigned int constant
or variable.
The reason I throw in a 0u is precisely to avoid
ambiguities around the promotion of unsigned char.
A cast would be sufficient, and more idiomatic, but
it's ugly IMHO.

--
Peter
Mar 3 '08 #14

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

26 posts views Thread by Chris Potter | last post: by
35 posts views Thread by David Cleaver | last post: by
13 posts views Thread by Dave win | last post: by
7 posts views Thread by Rajesh S R | last post: by
9 posts views Thread by hstagni | last post: by
27 posts views Thread by sophia | last post: by
reply views Thread by NPC403 | last post: by
1 post views Thread by subhajit12345 | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.