Переносимого числового ответа нет: важны размер int, порядок байтов и правила доступа через int8_t. На обычной little-endian платформе ожидают 0, но исходный код нельзя считать универсально корректным.
Кастование указателя и сдвиг
Переносимого числового ответа нет: важны размер int, порядок байтов и правила доступа через int8_t. На обычной little-endian платформе ожидают 0, но исходный код нельзя считать универсально корректным.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Нужно понять, как будет работать программа, если преобразовать указатель на массив целых чисел к типу int8_t*, выполнить смещение указателя и вывести полученный байт.
int data[8] = {1, 1, 1, 1, 1, 1, 1, 1};
int8_t* p = (int8_t*)data;
p += 3;
std::cout << (int)*p << std::endl;
Ответ
Переносимого числового ответа нет: важны размер int, порядок байтов и правила доступа через int8_t. На обычной little-endian платформе ожидают 0, но исходный код нельзя считать универсально корректным.
int8_t часто является signed char; он не входит в общее разрешение C++ на просмотр представления через char, unsigned char или std::byte. Безопаснее копировать представление:
unsigned char bytes[sizeof data];
std::memcpy(bytes, data, sizeof data);
std::cout << static_cast<unsigned>(bytes[3]) << '\n';
Нужен . Для 32-битного int без padding и 8-битного байта результат будет 0 при little-endian и 1 при big-endian.
Источник: eel.is.