2010-08-22 5 views

Antwort

10

Sie benötigen die Integer-Konstante des richtigen Typs zu machen. Das Problem ist, dass 0x100000000 als int interpretiert wird, und Casting/Zuweisung hilft nicht: die Konstante selbst ist zu groß für eine int. Sie müssen in der Lage, zu spezifizieren, dass die Konstante der uint64_t Typ ist:

uint64_t Key = UINT64_C(0x100000000); 

wird es tun. Wenn Sie nicht UINT64_C verfügbar verfügen, versuchen:

uint64_t Key = 0x100000000ULL; 

In der Tat, in C99 (6.4.4.1p5):

Der Typ eines Integer-Konstante die erste von der entsprechenden Liste ist in welcher sein Wert dargestellt werden kann.

und die Liste für hexadezimale Konstanten ohne Suffix ist:

int 
long int unsigned int 
long int 
unsigned long int 
long long int 
unsigned long long int 

Also, wenn Sie Ihren Compiler in C99-Modus aufgerufen, sollten Sie nicht eine Warnung (Danke Giles!).

0

Keine Garantie, aber Sie könnten versuchen:

uint64_t Key = 0x100000000ULL; 
4

Was Sie geschrieben haben ist perfekt gültig C99 (vorausgesetzt, Sie haben #include d <stdint.h>) ¹. Es sieht also so aus, als hätten Sie Ihren Compiler im C89-Modus und nicht im C99-Modus aufgerufen. In C89 gibt es keine Garantie, dass ein 64-Bit-Typ verfügbar ist, aber es ist eine allgemeine Erweiterung.

Da Sie unter Linux arbeiten, ist Ihr Compiler wahrscheinlich gcc. Gcc unterstützt eine 64-Bit long long auf allen Plattformen, sogar im C89-Modus. Sie können aber explizit müssen die Konstante als long long erklären:

uint64_t Key = 0x100000000ull; 

(ll bedeutet long long; u bedeutet unsigned und ist hier optional). Alternativ können Sie gcc im C99-Modus mit gcc -std=c99 ausführen.

¹ für die Sprache Anwälte: und haben einen ganzzahligen Typ mit genau 64 Wert Bits.