В вашем коде нет добавления двух unsigned int
. Фактически вы добавляете два unsigned short
, поскольку uint16_t
является определением типа для unsigned short
.
Правила целочисленного продвижения говорят, что любой целочисленный тип уже, чем int
, который появляется как операнд +
повышается до int
(а не unsigned int
, как вы могли ожидать).
Таким образом, задействованные шаги заключаются в том, что (int)4
добавляется к (int)6
, давая (int)10
, а затем присваивается обратно c
.
1018 * Вы должны найти, что все компиляторы дают правильное значение
c
, поведение кода определена корректно. 1021 * поведение
-Wconversion
является более спорным. Поскольку этот код является прекрасным примером, он часто дает предупреждение для четко определенного кода. У этой проблемы нет очевидного решения, кроме как просто не использовать флаги или каким-то образом обернуть ложное срабатывание (возможно,
#pragma
или вызовом функции).
Некоторые люди действительно хотят видеть предупреждение для этого кода, а некоторые нет. Точный набор случаев, для которых предупреждение генерируется -Wconversion
, продолжает меняться в g cc из-за того, что люди, отправляющие отчеты об ошибках, {do | not} хотят видеть предупреждение для некоторого конкретного случая.