7

In C, long is 64 bit on a 64 bit system. Is this reflected in Python's ctypes module?

Matt Joiner
  • 112,946
  • 110
  • 377
  • 526

4 Answers4

10

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”).

Matthew Murdoch
  • 30,874
  • 30
  • 96
  • 127
kennytm
  • 510,854
  • 105
  • 1,084
  • 1,005
4

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 What is the bit size of long on 64-bit Windows?

Community
  • 1
  • 1
casevh
  • 11,093
  • 1
  • 24
  • 35
2

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
  • 130,178
  • 23
  • 148
  • 122
1

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
  • 15,414
  • 2
  • 28
  • 26