Может кто-нибудь объяснить мне, что может случиться, если я забуду суффикс (постфикс) для констант (литералов) в ANSI C?C буквальный суффикс U, проблемы UL
Например, я видел для операций побитового сдвига таких устанавливает:
#define AAR_INTENSET_NOTRESOLVED_Pos (2UL) /*!< Position of NOTRESOLVED field. */
#define AAR_INTENSET_NOTRESOLVED_Msk (0x1UL << AAR_INTENSET_NOTRESOLVED_Pos) /*!< Bit mask of NOTRESOLVED field. */
#define AAR_INTENSET_NOTRESOLVED_Disabled (0UL) /*!< Interrupt disabled. */
#define AAR_INTENSET_NOTRESOLVED_Enabled (1UL) /*!< Interrupt enabled. */
#define AAR_INTENSET_NOTRESOLVED_Set (1UL) /*!< Enable interrupt on write. */
Он используется в 32-битной архитектуре. Но его можно было портировать на 16 или 8 бит. Что может случиться, если postfix UL не используется, и я буду использовать эти макросы для операций сдвига бит, как предполагается?
Я просто предполагаю, что, например, в 8-битной архитектуре может (1 < < 30) приводит к переполнению.
EDIT: Я нашел хорошую ссылку: http://dystopiancode.blogspot.cz/2012/08/constant-suffixes-and-prefixes-in-ansi-c.html
Но это безопасно использовать суффиксы, если код должен быть перенесен на различных архитектурах?
Например, если суффикс U представляет собой unisgned int, поэтому для 8-битной архитектуры обычно 16 бит, но для 32-битной переменной 32 бит, поэтому 0xFFFFAAAAU подходит для 32-битного компилятора,
«8-разрядная архитектура» не равна «может рассчитывать только до 255». Компилятор должен переводить вычисления большего размера, чем шины, в куски, которые легче усваиваются. – usr2564301