开发者

portable signed/unsigned byte cast,C++

开发者 https://www.devze.com 2022-12-13 22:02 出处:网络
I a开发者_开发知识库m using signed to unsigned byte(int8_t) cast to pack byts. uint32_t(uint8_t(byte)) << n

I a开发者_开发知识库m using signed to unsigned byte(int8_t) cast to pack byts.

uint32_t(uint8_t(byte)) << n

This works using GCC on Intel Linux. Is that portable for other platforms/compilers, for example PowerPC? is there a better way to do it? using bitset is not possible in my case. I am using stdint via boost


It's not portable, as the types uint32_t and uint8_t are not part of the C++ Standard. All such maipulations are inherently implementation dependent.


If you are using boost/cstdint.hpp from the Boost Integer library, then yes, the typedefs are portable (cross-platform.) The boost/cstdint.hpp header is meant to implement C99 stdint.h functionality in C++.

From the Boost documentation:

The header provides the typedef's useful for writing portable code that requires certain integer widths. All typedef's are in namespace boost.


In practice, yes it's most likely going to work on most other platforms you encounter (especially if Boost is ported to it). However, if you are writing these packed values to files or network sockets, you'll have to deal with byte order (your example of PowerPC has big-endian byte order while Intel have little-endian). In that respect, the code will behave differently on different hardware architectures.

0

精彩评论

暂无评论...
验证码 换一张
取 消