Вопрос немножко некорректен. 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()
.