'Why does data packing 4 integers into a 32 bit integer have different results in Nextion and Teensy(Arduino compatible)

I'm controlling a Teensy 3.5 with a Nextion touchscreen. On the Nextion the following code packs 4 8 bit integers into a 32 bit integer: sys0=vaShift_24.val<<8|vaShift_16.val<<8|vaShift_8.val<<8|vaShift_0.val Using the same shift amount (8) has a different result on the Teensy, however, the following generates the same result: combinedValue = (v24 << 24) | (v16 << 16) | (v08 << 8) | (v00); I'm curious why these shifts work differently. Nextion documentation: https://nextion.tech/instruction-set/

//Nextion:
vaShift_24.val=5
vaShift_16.val=4
vaShift_8.val=1
vaShift_0.val=51
sys0=vaShift_24.val<<8|vaShift_16.val<<8|vaShift_8.val<<8|vaShift_0.val

//Result is 84148531

//Teensy, Arduino, C++:

    value24 = 5;
    value16 = 4;
    value8 = 1;
    value0 = 51;
    packedValue = (value24 << 24) | (value16 << 16) | (value8 << 8) | (value0);
    Serial.print("24 to 0: ");
    Serial.println(packedValue);
    packedValue = (value24 << 8) | (value16 << 8) | (value8 << 8) | (value0);
    Serial.print("8: ");
    Serial.println(packedValue);

    //Result:
    //24 to 0: 84148531
 //8: 1331


Solution 1:[1]

Problem seems to be in this line:

sys0=vaShift_24.val<<8|vaShift_16.val<<8|vaShift_8.val<<8|vaShift_0.val

You are shifting by 8 in many places. Presumably you want:

sys0 = vaShift_24.val << 24  | vaShift_16.val << 16 | vaShift_8.val << 8 | vaShift_0.val

Now result from bytes 5, 4, 1, and 55 should be, in hex 0x05040133. If you are instead seeing 0x33010405 it means you would also have a byte order issue. But probably not.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 hyde