In C, long is 64 bit on a 64 bit system. Is this reflected in Python's ctypes module?
A:
Yes.
>>> ctypes.c_long(2**50)
c_long(1125899906842624)
>>> ctypes.c_long(2**64)
c_long(0)
>>> ctypes.c_long(2**63)
c_long(-9223372036854775808)
Yann Vernier
2010-07-24 04:18:22
I assume you're running this from an LP64 OS, but the other answers actually told me when and why :)
Matt Joiner
2010-07-24 15:24:34
+1
A:
Actually no.
On a Windows 64-bit system, long is 32 bits.
Python 3.1.2 (r312:79149, Mar 20 2010, 22:55:39) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import ctypes
>>> ctypes.c_long(2**31)
c_long(-2147483648)
>>> ctypes.c_long(2**31+1)
c_long(-2147483647)
>>> ctypes.c_long(2**31-1)
c_long(2147483647)
>>>
See http://stackoverflow.com/questions/384502/what-is-the-bit-size-of-long-on-64-bit-windows
casevh
2010-07-24 05:14:36
+1
A:
If a C long
is 64-bit (like it is on LP64 and ILP64 systems, pretty much any 64-bit system other than Windows), then so is ctypes.c_long
. If a C long isn't 64-bit (like on LLP64 systems such as 64-bit Windows) then a ctypes.c_long
isn't, either.
Thomas Wouters
2010-07-24 05:47:11
+3
A:
The size of long
depends on the memory model. On Windows (LLP64) it is 32-bit, on UNIX (LP64) it is 64-bit.
If you need a 64-bit integer, use c_int64
.
If you need a pointer-sized integer, use c_void_p
(“The value is represented as integer”).
KennyTM
2010-07-24 06:01:23
Oh wow, fantastic link, I never knew the memory model was formalized.
Matt Joiner
2010-07-24 15:22:17