2016-08-09 16 views
5

我想切換float和double值的「字節序」,它的工作原理確定,通過執行類似:交換「字節序」的花車和雙打

float const v{1.f}; 

swap(reinterpret_cast<::std::uint32_t const&>(v)); 

是否存在更好的方法來做交換,沒有演員?

編輯:swap()是gcc的內置函數的C++包裝,我沒有在這裏包括它。

uint16_t __builtin_bswap16 (uint16_t x) 
uint32_t __builtin_bswap32 (uint32_t x) 
uint64_t __builtin_bswap64 (uint64_t x) 

某些數據格式(如CBOR)需要交換字節數。

+0

這並不交換任何東西。事實上,我很確定這不會編譯。 –

+1

IEEE不包括字節碼,但實際上,您可能會認爲它的工作原理與整數相同。所以是的,這是醜陋的,但它通過鑄造起作用。 https://en.wikipedia.org/wiki/Endianness#Floating-point –

+0

假設sizeof(float)== sizeof(uint32_t) – Christophe

回答

4

儘管嘗試避免劇組是很好的做法,但這樣的使用是存在劇情的原因。一個endian swap是一個原始數據操作,所以爲了做到這一點,你必須刪除輸入信息,我會說,如果它不是endian正確的開始,那麼它不是一個浮點數,並且不應該以這種方式輸入而在錯誤的endianess狀態。