我发现很难理解以下代码之间的区别:
auto pixel = static_cast<uint32_t>( D3DCOLOR_RGBA( r, g, b, a ) );
auto components = (uint8_t*)&pixel;
std::array<uint8_t, 4> pixel_colours = { components[0], components[1], components[2], components[3] };
uint8_t b_a = pixel >> 24;
uint8_t b_r = ( pixel >> 16 ) & 0xFF;
uint8_t b_g = ( pixel >> 8 ) & 0xFF;
uint8_t b_b = pixel & 0xFF;
return static_cast<uint32_t>( D3DCOLOR_RGBA( r, g, b, a ) );
对于r,g,b,a = {255,128,64,0},pixel_colours的值为
{ 64, 128, 255, 0}
,而b_a,b_r,b_g,b_b的值为0, 255, 128, 64
我不明白为什么会发生这种差异-我希望它们是相同的。有人可以解释吗?
最佳答案
components[0]
... components[1]
作为字节数组访问内存,并按照在内存中列出的顺序进行读取。 pixel >> 24
... pixel & 0xFF
访问int的逻辑值。由于x86和x64(Intel)体系结构使用Little Endian,因此两者有所不同。 Endianess上的Wiki文章解释了所有详细信息。
关于c++ - 从字节指针读取位的差异,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45429373/