Информация об изменениях

Сообщение Обратный порядок считывания байтов в массиве от 12.06.2022 19:38

Изменено 12.06.2022 19:59 plusovik

Обратный порядок считывания байтов в массиве
Здравствуйте, почему байты считываются в обратном порядке?
Проверял на MSVC ( x86, x64 ) и на gcc, вывод один и тот же.
Читал, что иногда байты считываются в обратном порядке, но почему и где про это прочесть?
С какой целью производится такое странное считывание?

#include <iostream>
#include <inttypes.h>

int main()
{
    uint16_t x[ 9U ] = { 0, 0x11AA, 0x21ABU, 0x33CCU, 0x41D1U, 0x55EEU, 0x66FFU, 0xABCDU, 0xFEDCU };
    printf( "%llu, %llu, %llu, %llu, %llu\n\n",
        sizeof( int ),
        sizeof( uint8_t ), sizeof( uint16_t ),
        sizeof( uint32_t ), sizeof( uint64_t ) );

    uint8_t  a08 = *static_cast<uint8_t* >( static_cast<void*>( &x[2] ) );
    uint16_t a16 = *static_cast<uint16_t*>( static_cast<void*>( &x[2] ) );
    uint32_t a32 = *static_cast<uint32_t*>( static_cast<void*>( &x[2] ) );
    uint64_t a64 = *static_cast<uint64_t*>( static_cast<void*>( &x[2] ) );

    printf("%llu, a08: %lX\n",  sizeof( a08 ), static_cast<long int>( a08 ) );
    printf("%llu, a16: %lX\n",  sizeof( a16 ), static_cast<long int>( a16 ) );
    printf("%llu, a32: %lX\n",  sizeof( a32 ), static_cast<long int>( a32 ) );
    printf("%llu, a64: %llX\n", sizeof( a64 ), static_cast<long long int>( a64 ) );

    return 0;
}

// Output:
// 4, 1, 2, 4, 8
// 1, a08: AB
// 2, a16: 21AB
// 4, a32: 33CC21AB
// 8, a64: 55EE41D133CC21AB
Обратный порядок считывания байтов в массиве
Здравствуйте, почему байты считываются в обратном порядке?
Проверял на MSVC ( x86, x64 ) и на gcc, вывод один и тот же.
Читал, что иногда байты считываются в обратном порядке, но почему и где про это прочесть?
С какой целью производится такое странное считывание?

#include <iostream>
#include <inttypes.h>

int main()
{
    uint16_t x[ 9U ] = { 0, 0x11AA, 0x21ABU, 0x33CCU, 0x41D1U, 0x55EEU, 0x66FFU, 0xABCDU, 0xFEDCU };
    printf( "%llu, %llu, %llu, %llu, %llu\n\n",
        sizeof( int ),
        sizeof( uint8_t ), sizeof( uint16_t ),
        sizeof( uint32_t ), sizeof( uint64_t ) );

    uint8_t  a08 = *static_cast<uint8_t* >( static_cast<void*>( &x[2] ) );
    uint16_t a16 = *static_cast<uint16_t*>( static_cast<void*>( &x[2] ) );
    uint32_t a32 = *static_cast<uint32_t*>( static_cast<void*>( &x[2] ) );
    uint64_t a64 = *static_cast<uint64_t*>( static_cast<void*>( &x[2] ) );

    printf("%llu, a08: %lX\n",  sizeof( a08 ), static_cast<long int>( a08 ) );
    printf("%llu, a16: %lX\n",  sizeof( a16 ), static_cast<long int>( a16 ) );
    printf("%llu, a32: %lX\n",  sizeof( a32 ), static_cast<long int>( a32 ) );
    printf("%llu, a64: %llX\n", sizeof( a64 ), static_cast<long long int>( a64 ) );

    return 0;
}

// Output:
// 4, 1, 2, 4, 8
// 1, a08: AB
// 2, a16: 21AB
// 4, a32: 33CC21AB
// 8, a64: 55EE41D133CC21AB

// А я ожидал следующий Output:
// 4, 1, 2, 4, 8
// 1, a08: 21
// 2, a16: 21AB
// 4, a32: 21AB33CC
// 8, a64: 21AB33CC41D155EE