我发现很难理解以下代码之间的区别:

    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/

10-12 03:03