Ist reinterpret_cast
sicher dafür, und ist das der beste Weg, dies zu tun?In eine vorzeichenbehaftete Ganzzahl schreiben, als ob sie in C++ vorzeichenlos ist
Zum Beispiel habe ich im folgenden Code eine Klasse ibytestream
, die das Lesen von uint16_t
s und int16_t
s davon ermöglicht. ibytestream::next
ist ein vector<unsigned char>::iterator
.
inline ibytestream& operator>>(ibytestream& stream, uint16_t& data) {
data = 0;
data |= *stream.next++;
data <<= 8;
data |= *stream.next++;
return stream;
}
inline ibytestream& operator>>(ibytestream& stream, int16_t& data) {
return stream >> reinterpret_cast<uint16_t&>(data);
}
Ich will nicht, um den Code duplizieren, um das Bytes in einer ganzen Zahl konvertieren, so habe ich reinterpret_cast
für die signierte Version des Code aus der unsignierten Version wieder zu verwenden. Es funktioniert gut auf meiner Maschine, aber wird es im Allgemeinen auf anderen modernen Maschinen funktionieren?
Würde dies nicht gegen die strenge Aliasing-Regel verstoßen? http://StackOverflow.com/q/98650/417197 –
@Andre die Regel ermöglicht für Aliasing zwischen einem Integer-Typ und seiner signierten/unsignierten Variante –