Strange behaviour with old-style code

Henry Spencer henry at zoo.toronto.edu
Sun Feb 10 11:47:28 AEST 1991


In article <1991Feb6.190607.11731 at alias.uucp> rsargent at alias.UUCP (Richard Sargent) writes:
>The compiler passes floats widened to doubles, and the routine pulls
>the values off the stack using the appropriate widened addressing,
>but then proceeds to use the "declared" argument type to do single
>precision floating point arithmetic...

This is correct.  Only arrays and functions have their types silently
rewritten in function declarations.  Note 3.7.1:  "On entry to the
function the value of each argument expression shall be converted to
the type of its corresponding parameter, as if by assignment..."  So
an old-style function, absent prototypes, gets a float argument passed
as a double, and converts it to a float since the argument was declared
to be float.

(A subtle point here, evidently applicable in your case, is that it is
sometimes possible to convert a double to a float by simply ignoring
its low-order half.  Sounds like you're running on a VAX, where this
works.  Most modern machines use IEEE floating point, in which the trick
doesn't work because double has more exponent bits as well as more
mantissa bits, so the high-order half of a double isn't laid out the
same way as a float.)

K&R1 C silently rewrote float to double, but didn't rewrite char to int.
(Mostly because the ignore-lower-order trick is pretty dependable for
int->char but not for double->float.)  ANSI C rewrites neither.  This
point is actually discussed in the Rationale section for 3.7.1.
-- 
"Maybe we should tell the truth?"      | Henry Spencer at U of Toronto Zoology
"Surely we aren't that desperate yet." |  henry at zoo.toronto.edu   utzoo!henry



More information about the Comp.std.c mailing list