Хотя это отлично компилируется в 64-битной версии Linux с gcc:
#define CONST_1 255
#define CONST_2 255
#define CONST_PROD ((CONST_1) * (CONST_2))
он выдает предупреждение о переполнении на avr-gcc (8 бит):
constants.c:13:31: warning: integer overflow in expression [-Woverflow]
#define CONST_PROD ((CONST_1) * (CONST_2))
^
что достаточно справедливо, поскольку результат слишком велик для 16-битного целого числа со знаком.
Предупреждение исчезает при определении констант(ы) следующим образом:
#define CONST_1 255U
или добавив приведение:
#define CONST_PROD ((uint16_t)(CONST_1) * (CONST_2))
Я думаю, что на самом деле оба делают то же самое, но один из способов предпочтительнее другого?
255U
или255UL
, безусловно, самое простое решение. Я думаю, вам следует проверить, используете ли вы константы в любом контексте, где ожидается подписанное поведение. - person M.M   schedule 30.03.2016<limits.h>
. - person Jens   schedule 30.03.2016