integer type conversion problem/question

Faheem Mitha faheem at
Sat Oct 9 21:31:30 CEST 2004

[Screwed up setting the followup, sorry. Really setting followups to
alt.comp.lang.learn.c-c++ this time.]

On Sat, 09 Oct 2004 06:50:20 GMT, Faheem Mitha <faheem at> wrote:
> Hi,
> I'm not sure what would be more appropriate, so I'm ccing it to both
> alt.comp.lang.learn.c-c++ and comp.lang.python, with followup to
> alt.comp.lang.learn.c-c++.
> While working with a random number generator in the context of a mixed
> Python/C++ programming problem. I encountered a vexing type
> conversion problem.


Thanks to Alwyn and Terry Reedy for explaining things to me.  I think
I understand the main points. Harbison and Steele's "C A Reference
Manual" (I have the 4th Edn) had a clear explanation of how C
implements unsigned and signed ints, including two's complement and
all that.

It looks like using a random number generator which uses unsigned ints
as its seeds with Python is probably close to impossible then. Can
anyone suggest a good C/C++ random number implementation which can be
used easily with Python in this fashion? I want something that is
full-featured, ie. has reasonable support for different random number
distributions. Also, something that was already packaged in a
reasonable fashion as part of a shared library would be nice. I
suppose something whose seeds are stored as ints or longs would work

I was trying to use r-mathlib
(, the Debian
package corresponding to the standalone C Mathlib (math/stat library)
from R ( Unfortunately the random number
implementation uses unsigned ints, hence all the kerfuffle. I'm
including the source code at the end of this message, for the record.

I did have one followup question. If Python implements its integers as
signed C ints then surely 2^31 - 1 should be an integer rather than a
long? But I get

 In [9]: 2**31 - 1
 Out[9]: 2147483647L

 In [10]: type(2**31 - 1)
 Out[10]: <type 'long'>

Thanks for the help.

 *  Mathlib : A C Library of Special Functions
 *  Copyright (C) 2000, 2003  The R Development Core Team
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  GNU General Public License for more details.
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

/* A version of Marsaglia-MultiCarry */

static unsigned int I1=1234, I2=5678;

void set_seed(unsigned int i1, unsigned int i2)
    I1 = i1; I2 = i2;

void get_seed(unsigned int *i1, unsigned int *i2)
    *i1 = I1; *i2 = I2;

double unif_rand(void)
    I1= 36969*(I1 & 0177777) + (I1>>16);
    I2= 18000*(I2 & 0177777) + (I2>>16);
    return ((I1 << 16)^(I2 & 0177777)) * 2.328306437080797e-10; /* in [0,1) */

More information about the Python-list mailing list