Сложное задание на собеседовании

В качестве одного из вопросов на собеседовании мне был представлен следующий код:
bool XYZ()
{
unsigned int x = 1;
unsigned char c = *(unsigned char*)&x;
return !!c;
}

И к нему вопрос: Что делает этот код и где его можно применить на 32-битной архитектуре. (Дословно вопроса не помню, но суть вроде передал правильно)
И с первого взгляда и после недельных размышлений кажется, что функция всегда возвращает true, но так ли это?
  • Вопрос задан
  • 4020 просмотров
Решения вопроса 1
@Slko
C++/C#/Python Developer
Вопрос немножко некорректен. 32-битность здесь большой роли не играет (важно только, чтобы архитектура не была 8-битной, где длина типа int может быть равна длине типа char, но всё равно это тоже некорректно, т.к. размеры типов не зависят от разрядности архитектуры, надо было указывать разрядность типа int), роль играет порядок байт.
Если little-endian (интеловский порядок), то в c помещается наименьший значащий байт числа, т.е. это эквивалентно x % 256.
Если big-endian, то в c помещается наибольший значащий байт числа, т.е. это эквивалентно x >> 24 (для 32-битной архитектуры).
Соответственно, для little-endian эта операция над числом 1 вернёт 1, для big-endian - 0.
Двойной знак вопроса использовался в C (где нет типа bool) для нормализации значения (!!x эквивалентно x > 0 ? 1 : 0).
В C++ ! возвращает bool, а результат двойного применения отрицания это, по сути, преобразование типа исходного значения к bool (!!x эквивалентно (bool)x).
В любом случае, суть последнего выражения - возврат true/1, если архитектура little-endian, а иначе - false/0.
То есть назвать эту функцию можно было IsLittleEndian().
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы