2016-08-09 15 views
5

Tôi muốn chuyển đổi các "endianness" của phao và giá trị tăng gấp đôi, nó hoạt động OK, bằng cách làm một cái gì đó như:trao đổi "endianness" của phao nổi và tăng gấp đôi

float const v{1.f}; 

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

Liệu có tồn tại một cách tốt hơn để làm hoán đổi, không có dàn diễn viên?

EDIT: swap() là trình bao bọc C++ cho các chức năng tích hợp của gcc, tôi đã không đưa nó vào đây.

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

Hoán đổi kết thúc là cần thiết cho một số định dạng dữ liệu, như CBOR.

+0

Điều đó không trao đổi bất cứ điều gì. Trong thực tế, tôi khá chắc chắn rằng không biên dịch. –

+1

IEEE không bao gồm endianness nhưng bạn có thể, trong thực tế, giả sử nó hoạt động giống như số nguyên. Vì vậy, có nó xấu xí nhưng nó hoạt động bằng cách đúc. https://en.wikipedia.org/wiki/Endianness#Floating-point –

+0

Giả sử sizeof (float) == sizeof (uint32_t) – Christophe

Trả lời

4

Mặc dù thực hành tốt để thử và tránh phôi, nó sử dụng như thế này là lý do phôi tồn tại. Một trao đổi cuối cùng là một hoạt động dữ liệu thô để làm điều đó, bạn phải loại bỏ các thông tin đánh máy, tôi sẽ nói rằng nếu nó không phải là endian chính xác để bắt đầu, thì nó không phải là một phao và không bao giờ nên được gõ theo cách đó trong khi ở trạng thái kết thúc sai.

Các vấn đề liên quan