Кастование указателя и сдвиг

Переносимого числового ответа нет: важны размер 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.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее