It is actually guaranteed to behave this way for unsigned types. For signed types, overflow is UB, though on any system you'll encounter today it will probably either wrap around (2's complement) or saturate (most DSPs?).
That's not quite right. Specific behavior depends on language. In C++ with unsigned integer destination types, the result is always the least integer modulo congruent to the source integer modulo 2^n where n is the number of bits in the destination type. For a signed integer type, if the source integer value can be represented by the destination type, the value is unchanged. However, if not the result is implementation defined, not undefined.
C acts a lot like C++, other than weird wording in the standard; however, if the destination is a signed type and the original value cannot be represented in the destination type, the result can be an implementation defined value or an implementation defined signal can be raised.
C# on the other hand, for narrowing conversions that cannot be represented in the destination type, the result depends on whether or not overflow detection is enabled. If so, a narrowing conversion for an integer value that cannot be represented in the destination type will throw a System.OverflowException. If overflow checking isn't on, the result always consists of discarding the most significant bits of the source.