[Gelöst] 33bit Zahl mit c/c++
-
Hallo zusammen,
bin blutiger c/c++ Anfänger und suche eine Möglichkeit mit einer 33bit Zahl zu rechnen. Welchen Datentyp muss ich da nehmen und wie sage ich dem Compiler, dass er es mir richtig kompiliert?
Mit unsigned int, unsingen long, unsigned long int und unsigned long long funktioniert das irgendwie nicht. Da kommen dann manchmal negative Zahlen...

g++ -o i i.c
Arbeite unter Linux mit "gcc (GCC) 3.3.4 (pre 3.3.5 20040809)" bzw. "g++ (GCC) 3.3.4 (pre 3.3.5 20040809)"
-
int und long int sind in der regel gleich groß, beide 32-bit. int ist zwar nur als 16-bit garantiert, aber hat idr auch 32.
ganzahlige arithmetik für so grosse zahlen sind vielleicht in irgendeinem paket schon enthalten, weiss ich nicht.
wenn deine 33 bit zahlen nicht übermäßig groß werden, passen sie eventuell noch in unsigned int (bzw. long), das hat nen wertebereich von 0 - (2^32)-1.
ansonsten nimm irgendeinen fließkomma typ. float müsste eigentlich schon ausreichen. hat zwar auch nur 32 bit, durch die mantissen/exponenten darstellung lassen sich aber größere zahlen darstellen. double ist "bisschen" größer (64 bit) und long double ist geradezu riesig (80 bit).
aber halt alles fließkomma darstellung
-
Danke schon mal. Aber irgendwie geht das nicht. Mist.
Meine größte Zahl ist 8589934591. Muss also Werte von 0 bis 8589934591 speichern.
long double pts = 8589934591; Konsole: error: integer constant is too large for "long" typeVielleicht noch irgendein Hinweis?!?
-
Wenn ich nun
sizeof(unsigned long long)mache, so kommt 8. Das heißt doch, dass es 8 Byte also 64 Bit groß ist und damit meine max 33 Bit-Zahl darstellen soltte oder? Wo könnte der Fehler sein?
Ein
unsigned long long pts = (long long)(8589934591);bringt
error: integer constant is too large for "long" type
-
printf("%d") war nicht richtig. Mit printf("%lld") und unsigned long long pts = 8589934591LL; funktioniert es nun.
-
das problem war nicht primär die falsche formatierung von printf, sondern dass die zahl direkt im quellcode stand. ohne zusätze interpretiert c++ sowas als int oder long und dafür ist sie natürlich zu groß.
schlag"worte" wie 'f' oder 'L' hinter einer zahl sagen dem compiler, um was für eine art konstante es sich handelt und er kann entsprechend speicher reservieren.
-
camel filter schrieb:
int und long int sind in der regel gleich groß, beide 32-bit. int ist zwar nur als 16-bit garantiert
Das mag in C so sein, aber nicht in C++. Dort sind keine konkreten Grössen festgelegt, lediglich Relationen. Also dass zB int mindestens immer so gross ist wie long.
@dmh
Ganzzahlliterale ohne irgendwelche Zusätze sind immer erstmal vom Typ int. Durch entsprechende Suffixe kannst du daraus aber auch Literale eines anderen Typs machen. Und bedenke, long long ist kein C++ Typ, sondern lediglich eine Erweiterung deines Compilers.
-
groovemaster schrieb:
camel filter schrieb:
int und long int sind in der regel gleich groß, beide 32-bit. int ist zwar nur als 16-bit garantiert
Das mag in C so sein, aber nicht in C++. Dort sind keine konkreten Grössen festgelegt, lediglich Relationen. Also dass zB int mindestens immer so gross ist wie long.
umgekehrt: long ist mindestens so groß wie int
(und int ist mindestens 16 Bit groß)
-
Yep, das mit int und long muss natürlich andersrum lauten.
CStoll schrieb:
und int ist mindestens 16 Bit groß
Quellen?
-
steht so im ansi-c standard. int muss mindestens 2 byte gross sein.
-
groovemaster schrieb:
Das mag in C so sein, aber nicht in C++. Dort sind keine konkreten Grössen festgelegt, lediglich Relationen.
Das ist in C exakt genauso wie in C++.