Обратите внимание, что большинство ответов здесь не являются переносимыми, поскольку сегодняшние компиляторы будут оценивать эти ответы во время компиляции (зависит от оптимизации) и возвращать конкретное значение на основе определенного порядка байтов, тогда как фактический порядок байтов машины может отличаться , Значения, на которых проверяется порядок байтов, никогда не достигнут системной памяти, поэтому реальный исполняемый код будет возвращать один и тот же результат независимо от фактического порядка байтов.
Для , например , в ARM Cortex-M3 реализованная последовательность будет отражаться в бите состояния AIRCR.ENDIANNESS, и компилятор не может знать это значение во время компиляции.
Вывод компиляции для некоторых ответов, предложенных здесь:
https://godbolt.org/z/GJGNE2 для это ответ,
https://godbolt.org/z/Yv-pyJ для этого ответа и т. Д.
Для ее решения вам понадобится квалификатор volatile
. Ответ Yogeesh H T
является наиболее близким для сегодняшнего использования в реальной жизни, но поскольку Christoph
предлагает более всеобъемлющее решение, небольшое исправление его ответа сделает ответ завершенным, просто добавьте volatile
к профсоюзная декларация: static const volatile union
.
Это обеспечит сохранение и чтение из памяти, что необходимо для определения порядка байтов.