Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. C / C++ / MFC
  4. Storing 2 longs in a single variable

Storing 2 longs in a single variable

Scheduled Pinned Locked Moved C / C++ / MFC
question
16 Posts 8 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • C Chris Losinger

    use an unsigned __int64, something like: unsigned __int64 i64 = (unsigned long)longOne * ((unsigned long)-1) + longTwo; ie.. the high 4 bytes are your first long and the low four are your 2nd long. -c


    All you have to do is tell the people they are being attacked, and denounce the opposition for lack of patriotism and exposing the country to danger. -- Herman Goering, on how to control the public

    War Pigs

    G Offline
    G Offline
    Gilfrog
    wrote on last edited by
    #6

    How do i get the two longs back out of the unsigned__int64?

    C 1 Reply Last reply
    0
    • G Gilfrog

      How can i store 2 longs in a single variable. Similare to storing 2 shorts in a long with the MAKELONG macro. Can i do this with Long64? Thanks

      R Offline
      R Offline
      Ryan B
      wrote on last edited by
      #7

      A structure would solve the issue would it not? #pragma pack(1) typedef struct two_longs_dont_make_a_right { long one; long erone; } two_longs; ? Why in 'one' variable? Ryan Baillargeon Software Specialist Fuel Cell Technologies Inc.

      A 1 Reply Last reply
      0
      • R Ryan B

        A structure would solve the issue would it not? #pragma pack(1) typedef struct two_longs_dont_make_a_right { long one; long erone; } two_longs; ? Why in 'one' variable? Ryan Baillargeon Software Specialist Fuel Cell Technologies Inc.

        A Offline
        A Offline
        Anonymous
        wrote on last edited by
        #8

        I need to save an Array of 2 shorts and long to a text file. I just figured it would be easier to save them in one variable that to seperate them with commas or something like that.

        C 1 Reply Last reply
        0
        • A Anonymous

          I need to save an Array of 2 shorts and long to a text file. I just figured it would be easier to save them in one variable that to seperate them with commas or something like that.

          C Offline
          C Offline
          Chris Richardson
          wrote on last edited by
          #9

          Why not use a structure in combination with a union, like so:

          typedef struct tagTwoLongs
          {
          union
          {
          struct
          {
          long Long1;
          long Long2;
          };
          __int64 OneVariable;
          };
          }TwoLongs;

          Now you can refer to the two longs separately, via Long1 and Long2, or together, via OneVariable. Chris Richardson

          S PJ ArendsP 2 Replies Last reply
          0
          • C Chris Richardson

            Why not use a structure in combination with a union, like so:

            typedef struct tagTwoLongs
            {
            union
            {
            struct
            {
            long Long1;
            long Long2;
            };
            __int64 OneVariable;
            };
            }TwoLongs;

            Now you can refer to the two longs separately, via Long1 and Long2, or together, via OneVariable. Chris Richardson

            S Offline
            S Offline
            Scott H Settlemier
            wrote on last edited by
            #10

            Make sure that the pack pragma is 4 or less for the union technique to work. You might want to ensure this by temporarily specifying the packing alignment: #pragma pack(push,4) typedef struct tagTwoLongs { union { struct { long Long1; long Long2; }; __int64 OneVariable; }; }TwoLongs; #pragma pack(pop) P.S. Is there a way to get a compile time assertion that sizeof(long)==4?

            C G 2 Replies Last reply
            0
            • S Scott H Settlemier

              Make sure that the pack pragma is 4 or less for the union technique to work. You might want to ensure this by temporarily specifying the packing alignment: #pragma pack(push,4) typedef struct tagTwoLongs { union { struct { long Long1; long Long2; }; __int64 OneVariable; }; }TwoLongs; #pragma pack(pop) P.S. Is there a way to get a compile time assertion that sizeof(long)==4?

              C Offline
              C Offline
              Chris Richardson
              wrote on last edited by
              #11

              Good call on the packing. I forgot about that. Scott H. Settlemier wrote: P.S. Is there a way to get a compile time assertion that sizeof(long)==4? Yeah, in winnt.h, there's a macro called C_ASSERT. Here's it's definition, and the comment that describes it:

              //
              // C_ASSERT() can be used to perform many compile-time assertions:
              // type sizes, field offsets, etc.
              //
              // An assertion failure results in error C2118: negative subscript.
              //

              #define C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1]

              Chris Richardson

              S 1 Reply Last reply
              0
              • C Chris Richardson

                Good call on the packing. I forgot about that. Scott H. Settlemier wrote: P.S. Is there a way to get a compile time assertion that sizeof(long)==4? Yeah, in winnt.h, there's a macro called C_ASSERT. Here's it's definition, and the comment that describes it:

                //
                // C_ASSERT() can be used to perform many compile-time assertions:
                // type sizes, field offsets, etc.
                //
                // An assertion failure results in error C2118: negative subscript.
                //

                #define C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1]

                Chris Richardson

                S Offline
                S Offline
                Scott H Settlemier
                wrote on last edited by
                #12

                ooh, nice. thanks. I've been wanting that ability for a long time. I see they just sorta kludged one up there. (neg index error. :laugh:) Too bad this wasn't added to the language.

                1 Reply Last reply
                0
                • S Scott H Settlemier

                  Make sure that the pack pragma is 4 or less for the union technique to work. You might want to ensure this by temporarily specifying the packing alignment: #pragma pack(push,4) typedef struct tagTwoLongs { union { struct { long Long1; long Long2; }; __int64 OneVariable; }; }TwoLongs; #pragma pack(pop) P.S. Is there a way to get a compile time assertion that sizeof(long)==4?

                  G Offline
                  G Offline
                  Gilfrog
                  wrote on last edited by
                  #13

                  thanks, that works for me.

                  1 Reply Last reply
                  0
                  • C Chris Richardson

                    Why not use a structure in combination with a union, like so:

                    typedef struct tagTwoLongs
                    {
                    union
                    {
                    struct
                    {
                    long Long1;
                    long Long2;
                    };
                    __int64 OneVariable;
                    };
                    }TwoLongs;

                    Now you can refer to the two longs separately, via Long1 and Long2, or together, via OneVariable. Chris Richardson

                    PJ ArendsP Online
                    PJ ArendsP Online
                    PJ Arends
                    wrote on last edited by
                    #14

                    You mean the Win32 LARGE_INTEGER structure defined in WinNT.h


                    CPUA 0x5041 Sonork 100.11743 Chicken Little "So it can now be written in stone as a testament to humanities achievments "PJ did Pi at CP"." Colin Davies Within you lies the power for good - Use it!

                    Within you lies the power for good; Use it!

                    C 1 Reply Last reply
                    0
                    • PJ ArendsP PJ Arends

                      You mean the Win32 LARGE_INTEGER structure defined in WinNT.h


                      CPUA 0x5041 Sonork 100.11743 Chicken Little "So it can now be written in stone as a testament to humanities achievments "PJ did Pi at CP"." Colin Davies Within you lies the power for good - Use it!

                      C Offline
                      C Offline
                      Chris Richardson
                      wrote on last edited by
                      #15

                      I only replied to him an idea and a simple definition. I suppose I could have used (and would have used) LARGE_INTEGER as my example, but I didn't think of it at the time. Chris Richardson

                      1 Reply Last reply
                      0
                      • G Gilfrog

                        How do i get the two longs back out of the unsigned__int64?

                        C Offline
                        C Offline
                        Chris Losinger
                        wrote on last edited by
                        #16

                        longOne = i64 / (unsigned long)-1; longTwo = i64 - (longOne * (unsigned long)-1); or something similar -c


                        All you have to do is tell the people they are being attacked, and denounce the opposition for lack of patriotism and exposing the country to danger. -- Herman Goering, on how to control the public

                        War Pigs

                        1 Reply Last reply
                        0
                        Reply
                        • Reply as topic
                        Log in to reply
                        • Oldest to Newest
                        • Newest to Oldest
                        • Most Votes


                        • Login

                        • Don't have an account? Register

                        • Login or register to search.
                        • First post
                          Last post
                        0
                        • Categories
                        • Recent
                        • Tags
                        • Popular
                        • World
                        • Users
                        • Groups