double nach bitset<64>?
-
Toshi schrieb:
std::bitset<64>* test = reinterpret_cast<std::bitset<64>*>(&val);
endet in 64 Nullen...
std::bitset ist ein benutzerdefinierter Typ mit Konstruktoren, dessen Speicherlayout nicht vorgeschrieben ist. Was du da machst kann nicht gehen.
Es sollte doch möglich sein, Speicheradressen zu nehmen und sie statt als double ohne Konvertierungen als integer oder bitset zu interpretieren, oder?
Mir scheint du verwechselst hier die Bitsets aus C mit std::bitset.
Eigentlich wäre es wohl am einfachsten, einen __int64* zu nehmen und ihm die gleiche Adresse zu geben, wie dem double.
Das frißt der Compiler aber nicht. Er besteht auf einem cast...Ein reinterpret_cast sollte es tun.
__int64* p = reinterpret_cast<__int64*>(&deinDouble);
-
otze schrieb:
hmmm auch wenns keine ideallösung ist:den zeiger erst nach void* casten...
Wozu soll das gut sein?
-
HumeSikkins schrieb:
std::bitset ist ein benutzerdefinierter Typ mit Konstruktoren, dessen Speicherlayout nicht vorgeschrieben ist. Was du da machst kann nicht gehen.
Mir scheint du verwechselst hier die Bitsets aus C mit std::bitset.Mag sein, daß ich da was übersehen habe...
Bisher habe ich Bitsets auch noch nie verwendet. Es schien mir nur passend zu sein, weil ich ja gerne auf einzelne Bits zugreifen würde.HumeSikkins schrieb:
Ein reinterpret_cast sollte es tun.
__int64* p = reinterpret_cast<__int64*>(&deinDouble);
Wie kann ich denn einen __int64 mit cout ausgeben?
cout << *p << endl;
Funktioniert nicht, weil operator<< mehrdeutig ist.
-
Toshi schrieb:
Wie kann ich denn einen __int64 mit cout ausgeben?
Da C++ (noch) keinen 64 Bit Integer kennt (long long ist nur im C Standard bekannt) versucht der Compiler, *p in einen anderen, von cout unterstützten, Typ umzuwandeln, was aber nicht eindeutig ist, da es mehrere Möglichkeiten gibt.
-
groovemaster schrieb:
Da C++ (noch) keinen 64 Bit Integer kennt
C++ kennt keine Bitangaben der Builtins.
-
es gibt doch long long? ist das kein 64bit integer?
-
hola schrieb:
es gibt doch long long? ist das kein 64bit integer?
In C99 gibt es long long. Und wieviel Bit ein Datentyp hat, dass kann man nicht allgemeingültig sagen
-
C++ kennt keine Bitangaben der Builtins.
Fast keine : char hat 8 oder mehr Bit
-
MaSTaH schrieb:
C++ kennt keine Bitangaben der Builtins.
Was hat das mit meiner Aussage zu tun? Kannst du mir einen Standard Built-in Typ nennen, den ich unter einer 32 Bit Plattform für 64 Bit Integer verwenden kann?
Dass der Standard keine genauen Bitangaben, sondern lediglich das Verhältis der Integertypen zueinander definiert, ist mir schon klar.
-
Aus der stdlib.h
_CRTIMP char * __cdecl _i64toa(__int64, char *, int);
Damit kannst du dir deinen __int64 zuerst in ne Zeichenkette umwandeln und dann ausgeben
-
Ein Hoch auf VC6 und seine tolle Unterstützung der STL...
Nachdem ich Dev-Cpp installiert hatte, ging das mit dem reinterpret_cast nach bitset<64> zusammen mit der cout Ausgabe ohne Probleme und ich hatte genau was ich wollte!
Wenn man am Ende wirklich wissen will, was der Compiler treibt, dann muß man ihn wohl "ausschalten" und gleich ASM benutzen!
Hat mal jemand eine Liste alle AMD64 Befehle? :p
-
Toshi schrieb:
Ein Hoch auf VC6 und seine tolle Unterstützung der STL...
Nachdem ich Dev-Cpp installiert hatte, ging das mit dem reinterpret_cast nach bitset<64> zusammen mit der cout Ausgabe ohne Probleme und ich hatte genau was ich wollte!
Wenn man am Ende wirklich wissen will, was der Compiler treibt, dann muß man ihn wohl "ausschalten" und gleich ASM benutzen!
Hat mal jemand eine Liste alle AMD64 Befehle? :pDu kannst dir auf der Seite von AMD die Architektur-Dokumentation ziehen, dort
sind dann alle noetigen Informationen enthalten, die du benoetigst ;).mfg
v R
-
Toshi schrieb:
Ein Hoch auf VC6 und seine tolle Unterstützung der STL...
Nachdem ich Dev-Cpp installiert hatte, ging das mit dem reinterpret_cast nach bitset<64> zusammen mit der cout Ausgabe ohne Probleme und ich hatte genau was ich wollte!
Das verhalten ist trotzdem undefiniert, hat Hume doch oben begründet. Daß es auf dem Compiler dann geht heißt nicht, daß er besser ist. Nur daß er ein anderes Speicherlayout wählt oder ähnliches und es deswegen zufällig funktioniert.
MfG Jester
-
Hm...
Dann mal eine blöde Frage...
Wie könnte denn ein bitset aussehen, daß es mir Probleme bereiten würde??Jeder "normale" Programmierer wird da 64 zusammenhängende Bits im Speicher als Darstellung wählen und die Adresse auf das erste Bit legen.
Zusatzinformationen sind nicht nötig, weil C / C++ sowieso keine Bereichsprüfung verlangt...
Und wo wir gerade dabei sind.
Was würde sich denn sonst als sinnvolle "festgelegte" Alternative für mich anbieten?
Long long gibt es ja nach obigen Aussagen in C++ nicht...Bleibt mir noch ein eigener Struct, in den ich zwei "normale" longs reinpacke und es dann eben selbst mache...
Nur kann ich dann nicht so bequem auf einzelne Bits zugreifen und es als einen Block xor-en...
-
Toshi schrieb:
Ein Hoch auf VC6 und seine tolle Unterstützung der STL...
Selbst Schuld. Der Compiler ist ja mittlerweile auch über 6 Jahre alt und stammt noch aus einer Zeit, als der aktuelle Standard gerade erst verabschiedet wurde. Warum nimmst du keinen aktuellen MSC, den gibts auch kostenlos.
Toshi schrieb:
Und wo wir gerade dabei sind.
Was würde sich denn sonst als sinnvolle "festgelegte" Alternative für mich anbieten?
Long long gibt es ja nach obigen Aussagen in C++ nicht...Jeder (?) aktuelle Compiler hat zumindest einen Datentyp für 64 Bit. Du könntest dir damit einen eigenen Typ basteln.
#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901 typedef long long my_int64; #elif defined(_MSC_VER) typedef __int64 my_int64; #elif defined(__GNUC__) // ... #else #error Besorg dir 'nen ordentlichen Compiler! #endif
-
[quote="Toshi"]
Wie könnte denn ein bitset aussehen, daß es mir Probleme bereiten würde??template <int size> class bitset<size> { char infosDieIchSoBraucheUmDasZuImplementieren char[size/8+1] bits; };
schon paßt es nicht mehr. Wenn man die infos nach vorne stellt, dann würde es vielleicht wieder gehen.
Vielleicht fügt aber der Compiler für irgendwelches Alignement noch ein paar Bytes hinzu...[quote="Toshi"]
Jeder "normale" Programmierer wird da 64 zusammenhängende Bits im Speicher als Darstellung wählen und die Adresse auf das erste Bit legen.Ach? Ich dachte immer ich müßte bei meinen Klassen (nicht PODs) nicht drauf achten wie ich's baue, Hauptsache die Schnittstelle paßt. Kann ich ja nix dafür, wenn dann jemand meint mit nem Pointer an meinen Innereien rumfummeln zu müssen. Warum baust Du nicht gleich ein #define private public drüber?
Toshi schrieb:
Zusatzinformationen sind nicht nötig
und das weißt Du so genau? Vielleicht kann man's mit Zusatzinfos aber schneller implementieren? Warum schaust Du Dir nicht einfach an, wie's gemacht ist?
Ich sehe nicht, was gegen die Verwendung von int64 spricht. Das ist zwar dann nicht portabel, aber es ist wenigstens kein undefiniertes Verhalten.
MfG Jester
-
Und mit nem typedef __int64 int64; hat man gleichzeitig ne kleine Portabilität erreicht.
-
Im Prinzip verstehe ich die Aufregung nicht!
Das bitset besteht (soweit ich das sehe) aus einem Pointer auf ein unsigned long array und einer Art Index, den ich sowieso nicht benutze!
Die Größe wird über den Template Parameter übergeben, die Pointer setze ich selbst und der Index ist mir fürchterlich egal!Außerdem dem xor und dem ostream benutze ich nichts vom bitset!
Zugegeben, ein wenig unsauber ist es schon...
Aber wenigstens muß ich mir so nicht die Arbeit machen, für den __int64 eine binäre Ausgabe zu basteln!Wegen dem aktuellen VS in der Commandline Version...
Angesehen habe ich mir das Teil mal. Vollständig war das aber nicht, wenn ich mich recht entsinne! Habe es nicht mehr genau in Erinnerung, aber fehlt da nicht wenigstens der Linker?
-
groovemaster schrieb:
MaSTaH schrieb:
C++ kennt keine Bitangaben der Builtins.
Was hat das mit meiner Aussage zu tun?
Deine Aussage war falsch...
groovemaster schrieb:
Kannst du mir einen Standard Built-in Typ nennen, den ich unter einer 32 Bit Plattform für 64 Bit Integer verwenden kann?
Es gibt mehr als nur 32-Bit-Plattformen.
-
Toshi schrieb:
Zugegeben, ein wenig unsauber ist es schon...
Es ist eben nicht nur unsauber, sondern auch undefiniert. Das ist das blöde daran. Es funktioniert vielleicht mit ein bißchen Glück. Aber wenn es nicht tut, dann ist auch nicht der blöde Compiler oder sonstwas schuld. Wer solchen Code schreibt darf nicht erwarten, daß er funktioniert. So ist das nunmal. Bei Objekten fuhrwerkt man nicht einfach im Speicher rum wie man das möchte, sondern benutzt die Schnittstelle.
Du könntest zum Beispiel aus zwei unsigned longs jeweils in bitset<64> erzeugen. Das eine schiebst Du um 32 bit und dann benutzt Du ein simples | um die beiden miteinander zu verknüpfen. Oder Du wechselst auf ne 64bit-Plattform. Da ist long dann 64 bit und Du kannst es direkt im Konstruktor übergeben.
MfG Jester