Здравствуйте, Marty, Вы писали:
W>>Понадобилось? Зачем? Почему не подошло готовое?
M>Искать дольше 
То есть вопрос правильности не стоит?
W>>Ну, видимо невнимательно прочитал ту тему. Вот например:
M>Внимательно. Те компиляторы, которые я использую, все делают как нужно. Пока это устраивает.
Ясно. Хотя всё равно непонятно зачем оставлять явные ошибки, если можно сразу написать правильно.
M>Хотя эта копипаста самому не очень нравится,
В этом коде, кстати говоря, ещё один довольно сомнительный подход используется. Зачем нужно проводить вычисления над 8-,16-,32-х битными числами если длина машинного слова 64 бита (судя по наличию UINT64). Вместо этого просто сразу расширяешь все короткие числа до машинного слова, обрабатывать их как обычно, а потом, если нужно, при упаковке обратно проверять все переполнения.
Это же дико (и медленно) умножать два числа через полубайты, если у тебя регистр 64 или 32 бита. Ещё более дико становится если вспомнить, что много где есть возможность умножить пару машинных слов и получить результат двойной длины.
В общем, поэтому и спрашивал, зачем это нужно. Ибо сейчас код неправильный, небыстрый и некрасивый

(сам просил попинать).
W>>Эта функция у тебя иногда возвращает отрицательный результат вследствие переполнения на минимальном целом.
M>Это как?
integer_abs должна возвращать неотрицательный результат, так? А вот
integer_abs<int32_t>(-2147483648) возвращает число меньше нуля, хотя аргумент функции в int32_t помещается. Уж не знаю что ты с этим будешь делать, но явно тут прослеживается неконсистентность в подходе — одни функции пытаются сообщать об переполнениях, а другие их игнорируют.