printf("%f") question

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Ioannis Vranos

    #1

    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); ?
  • Ioannis Vranos

    #2
    Re: printf("%f ") question

    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); ?

    Comment

    • Harald van =?UTF-8?b?RMSzaw==?=

      #3
      Re: printf("%f ") question

      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.

      Comment

      • Ioannis Vranos

        #4
        Re: printf("%f ") question

        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);

        Comment

        • Harald van =?UTF-8?b?RMSzaw==?=

          #5
          Re: printf("%f ") question

          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.

          Comment

          • Martin Ambuhl

            #6
            Re: printf("%f ") question

            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.

            Comment

            • Keith Thompson

              #7
              Re: printf("%f ") question

              Harald van Dijk <truedfx@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%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"

              Comment

              • Ioannis Vranos

                #8
                Re: printf(&quot;%f &quot;) question

                Keith Thompson wrote:
                Harald van Dijk <truedfx@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
                >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.

                Comment

                • santosh

                  #9
                  Re: printf(&quot;%f &quot;) question

                  Ioannis Vranos wrote:
                  Keith Thompson wrote:
                  >Harald van Dijk <truedfx@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.

                  Comment

                  • Ioannis Vranos

                    #10
                    Re: printf(&quot;%f &quot;) question

                    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?

                    Comment

                    • Ioannis Vranos

                      #11
                      Re: printf(&quot;%f &quot;) question

                      ymuntyan@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.

                      Comment

                      • Peter Nilsson

                        #12
                        Re: printf(&quot;%f &quot;) question

                        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

                        Comment

                        • Ioannis Vranos

                          #13
                          Re: printf(&quot;%f &quot;) question

                          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.

                          Comment

                          • Peter Nilsson

                            #14
                            Re: printf(&quot;%f &quot;) question

                            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.

                            --
                            Peter

                            Comment

                            Working...