integer type conversion problem/question
Michael P. Dubner
dubnerm-news at mail.ru
Sun Oct 10 18:15:01 CEST 2004
Faheem Mitha wrote:
>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
>While working with a random number generator in the context of a mixed
>Python/C++ programming problem. I encountered a vexing type
>Briefly, the situation is as follows.
>I have a integer in Python (Python integers are implemented as C long
>This is passed to a function in C++ which converts it (supposedly) to
>an unsigned int, modifies it and then passes it back to Python. This
>is done since the random number generator uses unsigned ints.
>Python attempts to convert it to a Python integer, and if it is too
>large, converts it into a Python long. (Both integer and long are
>Now, my program crashes, because at some point the unsigned integer
>passed to Python becomes too long to be represented as an (unsigned)
>int, and I get an overflow error.
>OverflowError: long int too large to convert to int
>An example of such a number is 2321871520. Python thinks this should
>be a long, but my C++ code seems to handle it as an unsigned int, and
>passes it to Python as such. When Python converts it to a long and
>tries to pass it back, I get a runtime error.
>In : 2321871520
>I tried compiling the following fragment of code (header ommitted) and
>got a compiler warning: warning: this decimal constant is unsigned
>only in ISO C90.
>I'm not sure what to make of this.
> unsigned int a = 2321871520;
> cout << a << endl;
> return 0;
>I find all this a little strange. Since in theory Python ints are
>larger than C ints (since Python ints are implemented as C long ints),
>there should be (in theory) no problem converting C unsigned ints to
>Python integers (corresponding to C long integers) but in practice
>there is. Can anyone enlighten me as to this puzzling situation?
>I'd be happy to give more details as necessary. I realise the above
>may not be entirely clear, but excessive detail may be confusing.
>Please CC me on any reply. Thanks.
Use PyLong_AsUnsignedLong/PyLong_FromUnsignedLong instead of
In that case you'll only get OverflowError for numbers greater that 2**32-1.
Michael Dubner (dubnerm.at.mindless.com)
PS: Sorry for my English
More information about the Python-list