Como verificar se há excesso de número inteiro assinado em C sem comportamento indefinido?

Há (1):

// assume x,y are non-negative
if(x > max - y) error;

E (2):

// assume x,y are non-negative
int sum = x + y;
if(sum < x || sum < y) error;

Qual é o preferido ou existe uma maneira melhor.

questionAnswers(3)

yourAnswerToTheQuestion