2009-04-28 12 views
1

Ich versuche 64 Bit lange Ganzzahlen unter OS X 10.5.6 zu erzwingen. läuft auf einem Apple MacBook Intel Core 2 Duo. Hier ist mein c-Code:Wie erzwinge ich 64-Bit-Ganzzahlarithmetik auf OS X?

#include<stdio.h> 

int main() 
{ 
    long a = 2147483647; /*== 2^32 - 1*/ 
    long aplus1; 

    printf("a== %d. sizeof(a) == %d \n", a, sizeof(a)); 

    aplus1 = a+1; 

    printf("aplus1 = %d \n", aplus1); 
} 

Kompilieren ohne Schalter folgende Ausbeuten:

$ gcc testlong.c -o testlong ;./testlong 

a== 2147483647. sizeof(a) == 4 
aplus1 = -2147483648 

Kompilieren mit den -m64 Schalter ergibt:

$ gcc testlong.c -o testlong -m64; ./testlong 

a== 2147483647. sizeof(a) == 8 
aplus1 = -2147483648 

So ist die zweite Version ist offenbar mit 64-Bit-Speicher, erzeugt aber immer noch den Überlauffehler, obwohl 2^32 gut innerhalb des Bereichs einer 64-Bit-Ganzzahl liegen sollte. Irgendwelche Ideen?

Ich würde eine Lösung bevorzugen, die von einer GCC-Option erzwungen werden kann, anstatt dass ich mehrere Zeilen Quellcode ändern muss (mein aktuelles Problem ist nicht das obige Beispiel speziell, sondern ich muss lange Ganzzahlarithmetik in einem mehr erzwingen allgemeine Situation).

Antwort

0

Haben Sie versucht:

long long a = 2147483647; 
+0

Danke für die schnelle Antwort! Dies scheint jedoch nicht zu funktionieren, entweder mit oder ohne den Schalter -m64. – seandbarrett

3

Wenn Sie C99 verwenden, umfassen stdint.h und uint64_t und int64_t verwenden. Ansonsten sollte unsigned long long a = 0x100000000ull; auch funktionieren.

+0

Ich bin das zweite. Und zum Ausdrucken könnten Sie die PRI-Makros verwenden, die in stdint.h definiert sind printf ("a =%" PRIu64 "\ n"); – joveha

9

Nicht nur müssen Sie lange lange verwenden, aber Sie müssen auch die printf() -Anweisungen entsprechend ändern.

#include<stdio.h> 

int main() 
{ 
    long long a = 2147483647; /*== 2^32 - 1*/ 
    long long aplus1; 

    printf("a== %lld. sizeof(a) == %d \n", a, sizeof(a)); 

    aplus1 = a+1; 

    printf("aplus1 = %lld \n", aplus1); 
} 

% lld ist der Code für lange longs.

Anscheinend wahre 64-Bit-Programme können% d für 64-Bit-Ganzzahlen verwenden - ich weiß nicht, ob es möglich ist, es zu konfigurieren, in diesem Modus zu kompilieren.

+1

Tatsächlich ist die printf Formatspezifikation das Problem. Wenn das System von OP 32-Bit-Ints und 64-Bit-Longs hat, ist 'long long' nicht notwendig - nur das Format in"% ld "zu ändern sollte ausreichen. – ephemient

+0

Ok ja, Ephemient ist genau richtig. Es scheint, dass das Problem in meinem ursprünglichen Code in der printf-Anweisung war - der Wechsel zu% ld behebt das Problem, ohne "lange long" s zu benötigen, vorausgesetzt, ich kompiliere mit der Option -m64. Danke! – seandbarrett

+6

Mac OS X 64-Bit folgt dem LP64-Modell (int = 32, long = longlong = Zeiger = 64); Dies ist das gängigste 64-Bit-Modell. Win64 verwendet LLP64 (int = long = 32, longlong = Zeiger = 64). ICC akzeptiert '-DMKL_ILP64', um dem ILP64-Modell zu folgen (int = long = longlong = Zeiger = 64) und GCC hat '-mint64' für dasselbe, aber es ist auf den meisten Plattformen nicht verfügbar und bricht die Kompatibilität mit anderen Bibliotheken und System-APIs . – ephemient

0

Das Literal 2147483647 in C-Code ist vom Typ int. Wenn Sie wollen, dass es ein long ist, hilft es nicht, ein long auf der linken Seite zu haben, es ist immer noch ein int auf der rechten Seite.

Machen Sie es ein langes Literal, indem Sie ein 'L' hinzufügen: 2147483647L (Großbuchstaben werden empfohlen, Kleinbuchstaben 'l' funktioniert auch, kann aber je nach Schriftart sehr verwirrend sein).