2010-07-24 6 views

risposta

10

La dimensione di longdepends on the memory model. Su Windows (LLP64) è a 32 bit, su UNIX (LP64) è a 64 bit.

Se è necessario un numero intero a 64 bit, utilizzare c_int64.

Se è necessario un numero intero con puntatore, utilizzare c_void_p ("Il valore è rappresentato come numero intero").

+0

Oh wow, collegamento fantastico, non ho mai saputo che il modello di memoria fosse stato formalizzato. –

1

Sì.

>>> ctypes.c_long(2**50) 
c_long(1125899906842624) 
>>> ctypes.c_long(2**64) 
c_long(0) 
>>> ctypes.c_long(2**63) 
c_long(-9223372036854775808) 
+0

Suppongo che tu stia eseguendo questo da un sistema operativo LP64, ma le altre risposte in realtà mi hanno detto quando e perché :) –

4

Attualmente n.

Su un sistema Windows a 64 bit, lungo è 32 bit.

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

Vedi What is the bit size of long on 64-bit Windows?

+0

Bel lavoro calpestando la mia ipotesi che Windows 64x fosse a 64 bit. –

2

Se un C long è a 64 bit (come è il LP64 e ILP64 sistemi, praticamente qualsiasi sistema a 64 bit diverso da Windows), allora lo è anche ctypes.c_long. Se un C lungo non è a 64 bit (come nei sistemi LLP64 come Windows a 64 bit), non lo è neanche uno ctypes.c_long.