Ich arbeite an einer Funktion, wo ich ein 3-Byte-Array konvertieren und das 3-Byte-Array als einzelnes int32 zurückgeben muss. Der Code ist wie folgt: pbData ist ein Zeiger auf das Byte-Array.Setzen des höchstwertigen Vorzeichen-Bits (Lint-Warnung)
const byte bMSBitPosNeg = 0x80;
const byte bMSBNeg = 0xFF;
int32 i32Num = 0;
//Big - Endian
if (pbData != NULL)
{
if ((pbData[0] & bMSBitPosNeg) == bMSBitPosNeg) //Negative
{
i32Num |= (bMSBNeg * 0x1000000); //Force MSB to 0xFF as 3 bytes are
//converted to 4 bytes
}
i32Num |= (pbData[0] << 16);
i32Num |= (pbData[1] << 8);
i32Num |= (pbData[2]);
}
return i32Num;
Input: {0x00,0xBB, 0xA3 } Output: 48035 // positive Zahl
Input: {0xFF, 0x44,0x5d } Output: -48.035 // negative Zahl
Der Code funktioniert wie erwartet, aber ich bekomme eine Flusenwarnung. Warnung 648: Überlauf in Rechenkonstante für den Betrieb: 'Multiplikation'
Ich brauche die Funktionalität, aber nicht die Warnung.Wie kann ich es unterdrücken?
Verwenden Sie 'UL' Suffix auf Ihre' 0x1000000' Konstante –
Wenn Sie die Multiplikation als die entsprechende Verschiebung machen, wäre es dann sinnvoll? Denken Sie daran, dass Sie mit "int" arbeiten, was ein ** signierter ** 32-Bit-Typ ist (auf den meisten Plattformen). –
Ein allgemeiner Tipp: Wenn Sie mit Bits arbeiten, verwenden * immer * explizit nicht signierte Datentypen. –