Drei Datenbytes in einen Int schieben

Moin. Ich habe einen Sensor, der liefert 3 Datenbytes. MSB, MiddleByte und LSB.
Ich schiebe diese Werte nun in einen int32_t. Das scheint mit positiven Werten zu klappen. Aber wenn der Wert nun negativ wird, wird das ja so nicht erkannt, weil die MSB im int32 ja leer bleiben.
Siehe hier:

bytesAsInt = ((int32_t)inByte[0] << 16) | ((int32_t)inByte[1] << 8) | ((int32_t)inByte[2]);

Ich hab mit jetzt beholfen, indem ich, wenn von Byte[0] das Most Significant Bit 1 ist, noch mal ein FF an die vorderste Stelle schiebe. Siehe hier:

if ( bitRead(inByte[0], 7) == 1) {  
    bytesAsInt = ( (int32_t)testByte << 24) | ((int32_t)inByte[0] << 16) | ((int32_t)inByte[1] << 8) | ((int32_t)inByte[2]);
    Serial.println(bytesAsInt, BIN);
  }
  else if ( bitRead(inByte[0], 7) == 0) {  
    bytesAsInt = ((int32_t)inByte[0] << 16) | ((int32_t)inByte[1] << 8) | ((int32_t)inByte[2]);
  }

Das hab ich mir so zurech gewurstelt, aber das ist nicht schön, und ich bin mir mittlerweile auch nicht mehr sicher, ob es auch stimmt. Wobei die Werte die ich geliefert bekomme schon gut passen.
Wie würdet ihr drei Datenbytes verarbeiten?

Gruß
S

Schiebe das oberste Byte doch in einen vorzeichenbehafteten Integer (int8_t). Danach kopierst Du den in einen 4 Byte Integer (int32_t) und schiebst die letzten beiden Bytes dazu. Oder Du setzt das alles in einen 4 Byte Integer und setzt eine “0” hinten dazu. Danach schiebst Du alles 8 Bits nach rechts und fertig. Ich würde aber nachprüfen ob der Compiler wirklich einen arithmetischen oder einen bitweisen Shift für signed Integers implementiert.

Freaks!

Aha, das klappt auch ganz gut und sieht gleich viel eleganter aus. Und immerhin bestätigt sie mir auch, dass meine Lösung auch klappt. Nur etwas umständlicher... Und jetzt noch einen IF-Block gespart! Voll viel Platz jetzt!!! @ Marcus: Was meinste denn mit Freaks? Sowas!

@Markus W & Kurok: wieso Freaks? Das ist doch alles noch im Bereich von Anfängernivau. Googelt mal nach "Template Metaprogramming" oder schaut Euch gleich das hier an: http://www.cs.tut.fi/~kk/webstuff/MetaprogrammingCpp.pdf, danach reden wir weiter ;)

@kurok: Man könnte das auch mit Unions und ganz ohne Shifts lösen. Die Union besteht dazu sinnvollerweise aus einem int32_t und einer Struktur aus einem int16_t und 2 uint8_t. Und zwar so, dass das Speicherlayout für folgenden Ansatz passt: das höchste Byte wird in den int16_t geschoben und die anderen Bytes in die passenden uint8_t Felder. Danach liest man das Ergebnis direkt aus dem int32_t Teil der Union.