
On Monday 02 December 2013, 18:14:20, Isaac Dupree wrote:
C conversions from floating-point to signed or unsigned integral also saturate.
Not really. Clause 6.3.1.4 is quite explicit: "When a finite value of real floating type is converted to an integer type other than _Bool, the fractional part is discarded (i.e., the value is truncated toward zero). If the value of the integral part cannot be represented by the integer type, the behavior is undefined." and adds a footnote to make it unmistakeably clear that the remaindering operation need not be carried out when the target type is unsigned.
Unsigned types being Z/nZ is mathematically sound, but C is not very dedicated to this interpretation.
It's mandated in 6.2.5 (9), "A computation involving unsigned operands can never overflow, because a result that cannot be represented by the resulting unsigned integer type is reduced modulo the number that is one greater than the largest value that can be represented by the resulting type."
Furthermore, C signed arithmetic is undefined behavior if you overflow.
That cannot be stressed too much.