This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

64 bit math novice question

Hello,

I am new and I would highly appreciate help for a 64 Bit math question:
signed long long Off = 0;
signed long long u = 0;
unsigned int psensor_c2 = 0;
unsigned int psensor_c4 = 0;
signed int dT = 0;
int i = 0;

i = psensor_c2 << 16; // i = f.e. 0x012345

u = ((signed long long) (psensor_c4 * dT)) / 128; // u = 0x900000

line3: Off = (signed long long) 0x900000 + 0x012345;
line4: Off = (signed long long) i + u;

line3 gives me as result 0x912345
line4 gives me as result 0xffffffff00912345

My problem is: I have a signed integer with a maximum of 40 Bit length. So I need 64 Bit math. And I tell this the compiler with the hint (signed long long).
Why does exactly the same line of code give different results ? I expect the line3 result and don t understand why in line 4 the ffffffff are added for the high word.

Do the experts recommend me to write this in assembler, so that I can be sure that it is done exactly the way I want to have my 64 Bit math. Or are there compiler specialist, who know, how to tell the compiler, that he should add a signed 64 bit value to a 32 bit integer.

Any hints are welcome.

Parents Reply Children
  • line 3 shows me: 0000000000912345
    line 4 shows me: ffffffff00912345
    The ffffffff is the difference.

  • There have been too many discussions bugs in the debugger when it comes to displaying variables lately.

    Assign values to your two input variables.
    Perform the add.
    Print out the value of the variables and the value of the result.

    The compiler should not be able to produce the result you claim, with the input values you claim.

         signed             unsigned                 hex
        9511749              9511749              912345  <= expected result of u+i
    -4285455547 18446744069424096069    ffffffff00912345  <= your result of u+i
    -4294892731 18446744069414658885    ffffffff00012345  <= your result - u
    -4285530112 18446744069424021504    ffffffff00900000  <= your result - i
        9437184              9437184              900000  <= expected result - u
          74565                74565               12345  <= expected result - i
    But if:
        i = 0x80012345;              <= a negative value
        u = 0xffffffff80900000ull;   <= a negative value
    You get a sign-extend of i to:
        0xffffffff80012345ull;
    And the sum:
    -4285455547 18446744069424096069    ffffffff00912345  <= this matches your result
    

    Are you sure that not one of your input variables are what you think they are and not actually negative numbers?

    Please post a minimum program (complete source including printout) that gives your results.

  • Please show the specific code lines, the variable declaraions, and the specific input and output values.

    State clearly how you are observing the values.

    Show a couple of cases which "work", and a couple which you think "don't work"