@anacharsis
Nous sommes donc d'accord sur ce point.
La difficulté réside dans le flou laissé par le langage sur les entiers signés (représentation, valeur minimum) qui ne peut être résolu en toute généralité qu'en consultant les données de <limits.h>.

@Obsidian
Bien sûr que si. Il suffit de vérifier si « (type)0 » est supérieur à « (type)-1 ». Si ce n'est pas le cas, c'est que « -1 » a été transtypé en type non signé. Et de là, ce « -1 » converti est égal à « ~0 » et est forcément la valeur la plus haute. Dans l'autre cas, il suffit de décaler cette valeur d'un bit vers la droite (en introduisant un bit à zéro à gauche, donc).
Pour le MAX :
- Si le type est unsigned, pas de problème, la conversion d'un entier signé en un entier non signé est bien définie : si le type unsigned a pour valeur maximum MAX, le résultat de (type)(-1) est bien le maximum : (type)(-1) == (MAX+1)-1 == MAX

- Si le type est signé, comment introduire le 0 en bit de signe avec une simple expression ? Dans ce cas (type)-1 est négatif et le décalage à droite donne une valeur définie par l'implémentation et dépend donc du compilateur utilisé.

Pour le MIN :
- Si le type est unsigned, pas de problème, la valeur est 0

- Si le type est signé alors la valeur minimum n'est pas forcément -(MAX+1) mais peut aussi être -MAX. Cela dépend de l'implémentation.