Прежде всего, фраза «метод без ветвления» технически не имеет смысла при обсуждении кода C; оптимизатор может найти способы удалить ветки из «ветвистого» кода C и, наоборот, будет полностью в своих правах заменить ваш умный, не ветвящийся код веткой, просто чтобы вас злить (или потому что некоторые эвристики говорят, что это будет быстрее).
Кроме этого, простое выражение:
uint16_t b = a > UINT16_MAX ? UINT16_MAX : a;
, несмотря на то, что «имеет ветвь», будет скомпилирован с некоторым (без ветвления) условным перемещением (или, возможно, просто насыщенным) многими компиляторами на многих системах (я только что попробовал три разных компилятора для ARM и Intel, все сгенерировали условный ход).
Я бы использовал это простое, читаемое выражение. Если и только если ваш компилятор не достаточно умен, чтобы оптимизировать его (или ваша целевая архитектура не имеет условных перемещений), и если у вас есть контрольные данные, которые показывают, что это является узким местом для вашей программы, то я бы (а) найдите лучший компилятор и (b) сообщите об ошибке вашему компилятору, а только тогда поищите хитрые хаки.
Если вы действительно, действительно посвящаете себя тому, чтобы быть слишком умным наполовину, то второе предложение ruslik на самом деле довольно красиво (гораздо приятнее, чем общий мин / макс).