Что происходит в этом фрагменте относительно представления n в pc[i]

Я понятия не имею, что происходит. Вместо uint8_t я бы предположил, что нам нужно привести к указателю типа 1 байт, например char или bool, чтобы добиться такого поведения. Я полагаю, что обратный характер связан с порядком байтов?

РЕДАКТИРОВАТЬ: Я нашел свою ошибку мышления, конечно, uint8_t имеет размер 8 бит = 1 байт, так же, как bool и char (по крайней мере, на моей машине). Я по ошибке принял размер мыслей (pc), который является указателем и, следовательно, 8 байтами на моей 64 машине. Теперь все имеет смысл и с порядком байтов.

Спасибо, я ценю вашу помощь

#include <iostream>
#include <iomanip>

using std::cout;
using std::endl;
using std::hex;

int main()
{

int n{0x12345678};
cout << "01|    n=0x" << hex << n << endl;

uint8_t* pc{(uint8_t*)&n};
cout << "02|    n[0]=0x" << hex << +pc[0] 
    << ", n[1]=0x" << +pc[1]    // small trick: + to var to use as number
    << ", n[2]=0x" << +pc[2]
    << ", n[3]=0x" << +pc[3] << endl;

pc[1]=0xab;
pc[2]=0xcd;
cout << "03|    n[0]=0x" << hex << +pc[0] 
    << ", n[1]=0x" << +pc[1]
    << ", n[2]=0x" << +pc[2]
    << ", n[3]=0x" << +pc[3] << endl;
return 0;

}

выход:

01|    n=0x12345678
02|    n[0]=0x78, n[1]=0x56, n[2]=0x34, n[3]=0x12
03|    n[0]=0x78, n[1]=0xab, n[2]=0xcd, n[3]=0x12

1 ответ

Решение

Корень вашей проблемы - Endianness: порядок байтов в многобайтовом числе.

Little Endian:

Наименее значимый байт первым.
При заданном 0x12345678 значение будет сохранено в Little Endian как:

0x78 0x56 0x34 0x12

Big Endian:

Самый старший байт первый. Учитывая 0x12345678, значение будет сохранено в Big Endian как:

0x12 0x34 0x56 0x78

Endianness - это определение уровня процессора. Разные процессоры хранят многобайтовые числа разными способами.

Другие вопросы по тегам