Как проверить на целочисленное переполнение со знаком в C без неопределенного поведения?

Есть (1):

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

И (2):

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

Какой из них предпочтительнее или есть лучший способ.