"Strong typing vs. strong testing"

Keith Thompson kst-u at mib.org
Thu Sep 30 03:28:15 CEST 2010

RG <rNOSPAMon at flownet.com> writes:
> That the problem is "elsewhere in the program" ought to be small 
> comfort.

I don't claim that it's comforting, merely that it's true.

>           But very well, try this instead:
> [ron at mighty:~]$ cat foo.c
> #include <stdio.h>
> int maximum(int a, int b) { return a > b ? a : b; }
> int main() {
>   long x = 8589934592;
>   printf("Max of %ld and 1 is %d\n", x, maximum(x,1));
>   return 0;
> }
> [ron at mighty:~]$ gcc -Wall foo.c 
> [ron at mighty:~]$ ./a.out 
> Max of 8589934592 and 1 is 1

That exhibits a very similar problem.

8589934592 is 2**33.

Given the output you got, I presume your system has 32-bit int and
64-bit long.  The call maximum(x, 1) implicitly converts the long
value 8589934592 to int.  The result is implementation-defined,
but typically 0.  So maximum() is called with arguments of 0 and 1,
as you could see by adding a printf call to maximum().

Even here, maximum() did exactly what was asked of it.

I'll grant you that having a conversion from a larger type to a smaller
type quietly discard high-order bits is unfriendly.  But it matches the
behavior of most CPUs.

Here's another example:

#include <stdio.h>

int maximum(int a, int b) { return a > b ? a : b; }

int main(void) {
  double x = 1.8;
  printf("Max of %f and 1 is %d\n", x, maximum(x, 1));
  return 0;


Max of 1.800000 and 1 is 1

Keith Thompson (The_Other_Keith) kst-u at mib.org  <http://www.ghoti.net/~kst>
"We must do something.  This is something.  Therefore, we must do this."
    -- Antony Jay and Jonathan Lynn, "Yes Minister"

More information about the Python-list mailing list