Что происходит в этом фрагменте относительно представления 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 - это определение уровня процессора. Разные процессоры хранят многобайтовые числа разными способами.