簡體   English   中英

將uint32讀取為沒有溢出的浮點型嗎?

[英]Read an uint32 as a float without overflow?

我正在研究一種執行此類操作的程序:它需要一個浮點值數組,並在base64字符串中將值三乘三編碼。 對整個數組進行編碼后,如果還剩下一些值(數字<3),則會對其進行編碼並添加必要的'=' (有關更多信息,請參見此處 )。

無論如何,這不是問題。 我的問題是,在此base64字符串的開頭,我需要指出后面的浮點數,但要作為uint32。 但是,我被迫使用浮點數來使用我的函數...因此,我必須使用hack,並初始化指向uint32的指針,但將其讀取為浮點數。

這是我的方法:

uint32_t *ivalue = (uint32_t *)malloc(sizeof (uint32_t));
float *fvalue = (float *)ivalue;
// (...) some code
*ivalue = 2 * sizeof (float); // The value I want, 2 * 4 in this case (on my computer)
tempoCoor.push_back(*fvalue);

tempoCoor是我填充的std :: vector,當大小為3時,我對其內容進行編碼並將其清空。

但是,我的hackish方法存在問題...當我計算出小於256的值(我認為這是該值)時,一切都很好,但是當我的值大於或等於256時不是。這是為什么? 我該如何解決?

如果我不清楚,請向我詢問更多詳細信息。 如果需要,我可以解釋更多。

好的,所以這里有一些代碼錯誤的解釋:
1.為什么在C ++中使用malloc 這是一個壞習慣,僅在一些特殊情況下才適用。 改用new (也不要在[C]中強制轉換malloc或至少使用C ++強制轉換)
2.為什么還要在堆上分配內存? 在這種情況下,似乎完全沒有必要。
3.不要在C ++代碼中使用C-Style強制轉換-C ++強制轉換( static_cast等)更安全,並且包含一些錯誤檢查。

所以這是這段代碼的樣子。

uint32_t ivalue = 2 * sizeof(float); //simply assigning the value  
// ... some Code
tempoCoor.push_back(static_cast<float>(ivalue)); //using proper C++ cast to convert

當您在堆上使用內存並直接訪問它時,通過重新解釋一個指針(相當於reinterpret_cast ),您正在使用寫入那里的數據,就好像它是一個浮點數,顯然不是。 一旦您的值足夠大,某些位將被解釋為指數的一部分,並且您收到了錯誤的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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