Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : C: Konstanten größer uint64_t?



nobody0
28-01-2005, 17:44
Beim Schreiben von Bit-Definitionen ist mir aufgefallen, dass ANSI-C nur Konstanten bis unsigned long long int, also uint64_t, kennt, so dass diese Definition nicht ausreicht:

#define BIT40 (0x10000000000000000LL) // 2^(64), 18446744073709551616

Gibt's irgendeinen Trick mit dem man dennoch größere Konstanten definieren kann?
:confused:

Joghurt
29-01-2005, 02:35
In C(++) soweit ich weiss nicht, der Prozessor würde das auch nicht direkt unterstützen.
Was willst du denn machen? Ich vermute, du willst nicht gerade mit beliebig langen Ganzzahlen rechnen (dafür gibt es natürlich Bibliotheken)

nobody0
30-01-2005, 10:02
Ich brauche das für Bit-Definitionen, wie sie bei der Treiber-Programmierung und auch Mikrocontroller-Programmierung üblich sind:

# ifndef BIT0 /* ifdef to avoid redefinition; existing definitions should be ok */
# define BIT0 (0x1) // 2^0, 1
# endif
# ifndef BIT1
# define BIT1 (0x2)
# endif
...

Damit habe ich Konstanten für 2^0 ... 2^(0x40) ..., die auch für Bit-Felder gebraucht werden.
Es gibt ja Hardware die mehr als 64 Bit breite Register verwendet, beispielsweise auf Grafikkarten mit 256 Bit breiten Speicherbus. Da braucht man breitere Konstanten.

Joghurt
30-01-2005, 14:02
OK, das geht nicht.
In diesem Falle musst du, um z.B. Bit 32 zu prüfen, (beim little-endian Format) speicherstelle[1] testen (wenn speicherstelle als long* definiert ist), oder, du definierst eine
struct 256Bit { long ll;
long l;
long h;
long hh};, oder aber ein Bitfeld:
struct Bitfeld {
int bit0:1;
int bit1:1;
int bit2:1;
int bit3:1;
int bit4:1;
...
int bit254:1;}Aber dies ist wahrscheinlich compilerabhängig, ob das geht.

nobody0
30-01-2005, 16:45
Das Bitfeld geht im Prinzip, aber der Compiler kann da Lücken einbauen, beispielsweise wegen Alignment.
Notfalls kann ich die Werte ja mit Shiften hinbekommen, falls die direkten Konstaten nicht akzeptiert werden, so daß es kein großes Problem ist.
Compiler wie der gcc melden sich ja, wenn eine Konstante nicht oder nicht komplett akzeptiert wird.