簡體   English   中英

寫入有符號整數,就好像它在C ++中是無符號的一樣

[英]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作為簽名版本來重用未簽名版本的代碼。 它在我的機器上工作正常,但它會在其他現代機器上運行嗎?

是的,這是安全的。

該標准的三個部分適用於做出此決定:

  1. 有符號和無符號類型的對齊要求是相同的
  2. 允許在指向具有相同對齊要求的類型的指針之間進行轉換
  3. 當執行glvalues之間的強制轉換時,如果相應指針之間的強制轉換有效,則強制轉換有效。

對於每個標准有符號整數類型,存在相應的(但不同的)標准無符號整數類型: unsigned charunsigned short intunsigned intunsigned long intunsigned 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM