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.
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%h u\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_Keit h) <kst-u@mib.org>
Nokia
"We must do something. This is something. Therefore, we must do this."
-- Antony Jay and Jonathan Lynn, "Yes Minister"
>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
>implementation s -- 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.
>>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.
>
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.
Ioannis Vranos <ivra...@nospam .no.spamfreemai l.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.
Comment