long long int auf 32-bit-Linux-vs-64-bit-Linux-und MPFR

Wie genau funktioniert ein 32-bit-Linux-system Griff long long int im Vergleich zu 64-bit-Linux?

Auf meinem 32 bit-system verwende ich ein C++ - wrapper für die MPFR-Datentyp; dieser wrapper hat ein Konstruktor definiert long int aber nicht long long int. Dennoch, auf die 32-bit-system ist dieser code nur funktioniert:

long long int i=5LL;
mpreal myVar(i);
cout<< "this was constructed with a long long int:" <<myVar <<endl;

Wie ist das möglich? Funktioniert die 32-bit gcc nur irgendwie Stimmen die long long int zu sagen long int für die die mpreal Daten Typ hat haben einen Konstruktor? Wenn der obige code ausgeführt wird, auf 64-bit-Linux-dann wird der compiler mit einem Fehler führt, über den Bau wird mehrdeutig.

Ich weiß, dass einige Leute sagen mir nicht zu verwenden long long int überhaupt auf 64 bit, aber leider bin ich mit einer anderen Bibliothek (odeint), wo dieser eingebaut ist, um den code zu konstruieren, die meine gegeben multiprecision-Datentyp dieser Weise, so glaube ich nicht, ich kann die Dinge ändern.

Ist long long int genau das gleiche wie long int auf 64-bit überhaupt? , Verliere ich Daten wenn ich cast zu long int? wenn ich z.B. meine eigenen Konstruktor wie:

mpreal(const long long int u, mp_prec_t prec, mp_rnd_t mode)
{
    mpfr_init2(mp,prec);
    mpfr_set_si(mp, u, mode);
}
  • Die Konstruktoren sind mehrdeutig?
  • error: call of overloaded 'mpreal(long long int)' is ambiguous. Es ist einfach nicht definiert, auf gebaut aus einem long long int, aber trotzdem auf 32 bit gcc funktioniert einfach irgendwie, aber nicht auf 64-bit-linux. Es sei denn, ich Schreibe meine eigenen Konstruktor für den Bau von long long int in die mpreal.h, wie in meinem OP.
  • Aus wiki: On 32-bit Linux, DOS, and Windows, int and long are 32-bits, while long long is 64-bits. On 64-bit Linux, int is 32-bits, while long and long long are 64-bit. Ich denke, das erklärt vielleicht die situation, mpreal wie es aussieht, überprüft, ob die 32-bit-und falls ja, definiert einen Konstruktor für int64_t (was ist long long int auf 32-system). Aber für 64x system long int und long long int sind die gleiche Sache, so dass im Prinzip niemand sollte die Fütterung in long long int also ich denke, so ein Konstruktor definiert?
  • Wo genau tritt das problem in odeint (Datei-und linenumber)?
  • /odeint/boost/numeric/odeint/stepper/runge_kutta_dopri5.hpp:300: Fehler: Aufruf des überladenen 'mpreal(long long int)' ist mehrdeutig
  • odeint/boost/numeric/odeint/stepper/runge_kutta_dopri5.hpp:301: Fehler: Aufruf des überladenen 'mpreal(long long int)' ist mehrdeutig
  • auch die gleichen Fehler beim 302, 303
  • Siehe unten meine Antwort auch, und Autor von MPFRC++ in holoborodko.com/pavel/mpfr/#comment-7444. Aber wäre es möglich in odeint zu use types with explicit number of bits: int32_t, int64_t from stdint.h. Then move from x32 to x64 would be painless als Autor von MPFRC++ suggeriert? Vielleicht ist dies eine Menge Arbeit..ich weiß nicht.

InformationsquelleAutor fpghost | 2012-12-04
Schreibe einen Kommentar