I can't really find an "authoritative" source on this matter, mostly because this is probably a matter of convention, and terminology is often very inconsistent. But, the following excerpt from Robert Seacord's "Secure Coding in C and C++" sums up my understanding of the situation:
An integer overflow occurs when an
integer is increased beyond its
maximum value or decreased beyond its
minimum value3. Integer overflows are
closely related to the underlying
The footnote goes on to say:
 Decreasing an integer beyond its
minimum value is often referred to as
an integer underflow, although
technically this term refers to a
floating point condition.
The reason we call it an integer overflow is because there just isn't enough space available in the type to represent the value. In that sense, it's similar to a buffer overflow (except rather than actually crossing the buffer boundary, it usually exhibits wrap-around behavior.*) From this perspective, there is no conceptual difference between
INT_MIN - 1 and
INT_MAX + 1. In both cases there simply isn't enough space in the
int data type to represent either value - so what we have is an overflow.
It also might be useful to note that in the x86 and x86_64 processor architectures, the flags register includes an overflow bit. The overflow bit is set when a signed integer arithmetic operation overflows. The expression
INT_MIN - 1 will set the overflow bit. (There is no "underflow" bit.) So clearly, the engineers at AMD and Intel use the term "overflow" to describe the result of an integer arithmetic operation which has too many bits to fit in the data type, regardless of whether the value is numerically too large or too small.
*In fact, in C, signed integer overflow is actually undefined behavior, but in other languages such as Java, the two's complement arithmetic will wrap around.