[英]Writing to a signed integer as if it is unsigned in C++
reinterpret_cast
是否安全,這是最好的方法嗎?
例如,在下面的代碼中,我有一個名為ibytestream
的類,它允許ibytestream
讀取uint16_t
s和int16_t
s。 ibytestream::next
是一個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);
}
我不想復制用於將字節轉換為整數的代碼,因此我使用reinterpret_cast
作為簽名版本來重用未簽名版本的代碼。 它在我的機器上工作正常,但它會在其他現代機器上運行嗎?
是的,這是安全的。
該標准的三個部分適用於做出此決定:
對於每個標准有符號整數類型,存在相應的(但不同的)標准無符號整數類型:
unsigned char
,unsigned short int
,unsigned int
,unsigned long int
和unsigned long long int
,每個都占用相同的量存儲並具有相同的對齊要求。可以將對象指針顯式轉換為不同類型的對象指針。 將“指向T1的指針”類型的prvalue轉換為“指向T2的指針”類型(其中T1和T2是對象類型,T2的對齊要求不比T1更嚴格)並返回其原始類型會產生原始類型指針值。
如果可以使用reinterpret_cast將“指向T1的指針”類型的表達式顯式轉換為“指向T2的指針”類型,則可以將類型T1的glvalue表達式強制轉換為“對T2的引用”。 結果引用與源glvalue相同的對象,但具有指定的類型。
是的,這應該是完全沒問題的。 (在int和字節數組之間移動有潛在的endian-ness問題,但這是另一個適用於有符號和無符號數字的問題。)
完全不同的東西:這一點:
data = 0;
data |= *stream.next++;
......可以簡化:
data = *stream.next++;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.