
On 12/02/2013 07:14 PM, Daniel Fischer wrote:
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.
Whoops! Thank you for correcting me.
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."
Yes, indeed, C unsigned arithmetic *is* Z/nZ and that is lovely (when you want it, at least). My point there was that some functions/operations specified by the C standard that are related to unsigned types, like conversion from strings (strtoul()) and floats (casting), aren't modulo 2^n. I see that's a weak point since each of those only differ from modulo in error conditions (errno set, or undefined behaviour). If C was as good as(?) Haskell it might use modulo for those conversions too. -Isaac