unsigned integer?

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

    unsigned integer?

    This is a naive question:

    "%u" % -3

    I expect it to print 3. But it still print -3.

    Also, if I have an int, I can convert it to unsigned int in C:
    int i = -3;
    int ui = (unsigned int)i;

    Is there a way to do this in Python?


  • Dan Bishop

    #2
    Re: unsigned integer?

    On Mar 10, 11:32 am, "Jack" <nos...@invalid .comwrote:
    This is a naive question:
    >
    "%u" % -3
    >
    I expect it to print 3. But it still print -3.
    >
    Also, if I have an int, I can convert it to unsigned int in C:
    int i = -3;
    int ui = (unsigned int)i;
    >
    Is there a way to do this in Python?
    def unsigned(n):
    return n & 0xFFFFFFFF

    Comment

    • Duncan Booth

      #3
      Re: unsigned integer?

      "Jack" <nospam@invalid .comwrote:
      This is a naive question:
      >
      "%u" % -3
      >
      I expect it to print 3. But it still print -3.
      Internally it uses the C runtime to format the number, but if the number
      you ask it to print unsigned is negative it uses %d instead of %u. I have
      no idea if it is actually possibly to get a different output for %d versus
      %u.
      >
      Also, if I have an int, I can convert it to unsigned int in C:
      int i = -3;
      int ui = (unsigned int)i;
      >
      Is there a way to do this in Python?
      >
      Depeneding on how exactly you want it converted:

      i = -3
      ui = abs(i)
      print ui
      ui = (i & 0xffff) # for 16 bit integers
      print ui
      ui = (i & 0xffffffff) # for 32 bit integers
      print ui
      ui = (i & 0xfffffffffffff fff) # for 64 bit integers
      print ui
      ui = (i & 0xfffffffffffff fffffffffffffff ffff) # for 128 bit integers
      print ui

      which gives the following output:

      3
      65533
      4294967293
      184467440737095 51613
      340282366920938 463463374607431 768211453

      There isn't a unique way to convert a Python integer to an unsigned value
      which is why the %u format string cannot do anything other than print the
      value. Personally I'd have expected the Python one to either print the
      absolute value or throw an exception, but I guess making it an alias for %d
      kind of makes sense as well.

      Comment

      • hg

        #4
        Re: unsigned integer?

        Dan Bishop wrote:
        On Mar 10, 11:32 am, "Jack" <nos...@invalid .comwrote:
        >This is a naive question:
        >>
        >"%u" % -3
        >>
        >I expect it to print 3. But it still print -3.
        >>
        >Also, if I have an int, I can convert it to unsigned int in C:
        > int i = -3;
        > int ui = (unsigned int)i;
        >>
        >Is there a way to do this in Python?
        >
        def unsigned(n):
        return n & 0xFFFFFFFF

        or abs(-1) ?


        Comment

        • Dan Bishop

          #5
          Re: unsigned integer?

          On Mar 10, 11:50 am, Duncan Booth <duncan.bo...@i nvalid.invalid>
          wrote:
          "Jack" <nos...@invalid .comwrote:
          This is a naive question:
          >
          "%u" % -3
          >
          I expect it to print 3. But it still print -3.
          >
          Internally it uses the C runtime to format the number, but if the number
          you ask it to print unsigned is negative it uses %d instead of %u. I have
          no idea if it is actually possibly to get a different output for %d versus
          %u.
          %u used to be different from %d, but it changed because of the int/
          long unification in Python 2.4.

          Comment

          • Duncan Booth

            #6
            Re: unsigned integer?

            "Dan Bishop" <danb_83@yahoo. comwrote:
            On Mar 10, 11:50 am, Duncan Booth <duncan.bo...@i nvalid.invalid>
            wrote:
            >"Jack" <nos...@invalid .comwrote:
            This is a naive question:
            >>
            "%u" % -3
            >>
            I expect it to print 3. But it still print -3.
            >>
            >Internally it uses the C runtime to format the number, but if the
            >number you ask it to print unsigned is negative it uses %d instead of
            >%u. I have no idea if it is actually possibly to get a different
            >output for %d versus %u.
            >
            %u used to be different from %d, but it changed because of the int/
            long unification in Python 2.4.
            >
            Yes, I guessed that was it.

            The implementation is identical when the value is negative but still
            different when the integer is non-negative which is why I questioned
            whether it was actually possible to get different output. If not perhaps
            both the implementation and the documentation should be simplified.

            Comment

            • Jack

              #7
              Re: unsigned integer?

              Thanks for all the replies. Because I want to convert an int,
              Dan's function actually does it well.

              "Jack" <nospam@invalid .comwrote in message
              news:I9Kdndp49P JLdm_YnZ2dnUVZ_ t-mnZ2d@comcast.c om...
              This is a naive question:
              >
              "%u" % -3
              >
              I expect it to print 3. But it still print -3.
              >
              Also, if I have an int, I can convert it to unsigned int in C:
              int i = -3;
              int ui = (unsigned int)i;
              >
              Is there a way to do this in Python?
              >

              Comment

              • Paul Rubin

                #8
                Re: unsigned integer?

                "Jack" <nospam@invalid .comwrites:
                Also, if I have an int, I can convert it to unsigned int in C:
                int i = -3;
                int ui = (unsigned int)i;
                I just tried it:

                main() {
                int i = -3;
                unsigned int ui = i;
                printf("%d\n", ui);
                }

                prints -3. What do you want the conversion to do? If you want
                the absolute value, use abs().

                Comment

                • Gabriel Genellina

                  #9
                  Re: unsigned integer?

                  En Sat, 10 Mar 2007 16:26:08 -0300, Paul Rubin
                  <"http://phr.cx"@NOSPAM. invalidescribió :
                  "Jack" <nospam@invalid .comwrites:
                  >Also, if I have an int, I can convert it to unsigned int in C:
                  > int i = -3;
                  > int ui = (unsigned int)i;
                  >
                  I just tried it:
                  >
                  main() {
                  int i = -3;
                  unsigned int ui = i;
                  printf("%d\n", ui);
                  }
                  >
                  prints -3. What do you want the conversion to do? If you want
                  the absolute value, use abs().
                  Try again with "%u". Passing i or ui makes no difference, both push the
                  same value on the stack. C relies on the format string to interpret the
                  arguments.

                  --
                  Gabriel Genellina

                  Comment

                  • Paul Rubin

                    #10
                    Re: unsigned integer?

                    "Gabriel Genellina" <gagsl-py2@yahoo.com.a rwrites:
                    Try again with "%u". Passing i or ui makes no difference, both push
                    the same value on the stack. C relies on the format string to
                    interpret the arguments.
                    If you use %u you get a very large positive value, not +3.

                    Comment

                    • Gabriel Genellina

                      #11
                      Re: unsigned integer?

                      En Sat, 10 Mar 2007 20:26:13 -0300, Paul Rubin
                      <"http://phr.cx"@NOSPAM. invalidescribió :
                      "Gabriel Genellina" <gagsl-py2@yahoo.com.a rwrites:
                      >Try again with "%u". Passing i or ui makes no difference, both push
                      >the same value on the stack. C relies on the format string to
                      >interpret the arguments.
                      >
                      If you use %u you get a very large positive value, not +3.
                      Exactly, and that's the right value. (unsigned int)(-3) isn't +3.

                      --
                      Gabriel Genellina

                      Comment

                      • Paul Rubin

                        #12
                        Re: unsigned integer?

                        "Gabriel Genellina" <gagsl-py2@yahoo.com.a rwrites:
                        If you use %u you get a very large positive value, not +3.
                        Exactly, and that's the right value. (unsigned int)(-3) isn't +3.
                        The OP specified that the expected result was 3.

                        Comment

                        • Bjoern Schliessmann

                          #13
                          Re: unsigned integer?

                          Paul Rubin wrote:
                          The OP specified that the expected result was 3.
                          But that's not what he'd get with his C conversion ;)

                          Regards,


                          Björn

                          --
                          BOFH excuse #348:

                          We're on Token Ring, and it looks like the token got loose.

                          Comment

                          • Bjoern Schliessmann

                            #14
                            Re: unsigned integer?

                            hg wrote:
                            Dan Bishop wrote:
                            >def unsigned(n):
                            > return n & 0xFFFFFFFF
                            >
                            or abs(-1) ?
                            Nah! Bitwise operators are cool. ;)

                            Though ANDing won't make the int unsigned.

                            Regards,


                            Björn

                            --
                            BOFH excuse #23:

                            improperly oriented keyboard

                            Comment

                            • Gabriel Genellina

                              #15
                              Re: unsigned integer?

                              En Sat, 10 Mar 2007 21:04:00 -0300, Paul Rubin
                              <"http://phr.cx"@NOSPAM. invalidescribió :
                              "Gabriel Genellina" <gagsl-py2@yahoo.com.a rwrites:
                              If you use %u you get a very large positive value, not +3.
                              >Exactly, and that's the right value. (unsigned int)(-3) isn't +3.
                              >
                              The OP specified that the expected result was 3.
                              Ouch! Yes, sorry, I overlooked it. And the C code just made things more
                              confusing.

                              --
                              Gabriel Genellina

                              Comment

                              Working...