Unterchied zwischen int und long?



  • Hi Leute!
    Gibt es heute noch einen Unteschied zwischen int und long? (außer der Name)



  • sizeof (int) <= sizeof (long). Per Definition.

    Das heisst, dass long grösser sein KANN, als int.



  • naja

    es sit eheutzutage eig so dass int 32 bit gross ist (auf 32 bit systemen)
    long ist auch so gross

    aber es kann von compiler zu compiler unterschiedlich sein udn long könnte 64 bit gross sein

    oder wie bei visual c++, es wird einfahc long long bzw __int64 eingeführt



  • Skym0sh0 schrieb:

    es sit eheutzutage eig so dass int 32 bit gross ist (auf 32 bit systemen)
    long ist auch so gross

    Die Single UNIX Specification definiert für UNIX: ILP32 und LP64. D.h. im 32Bit Modus sind int, long und pointer 32Bit groß, im 64Bit Modus sind long und pointer 64Bit groß, int ist 32bit.



  • Intressanter Beitrag 😉

    Ich versuche seit ein paar Tagen eine Integer-Klasse zu erstellen, die theoretisch unendlich lange Zahlen darstellen kann. Bei den Rechenoperationen gibt es nun zwei Möglichkeiten Pufferüberläufe zu verhindern.

    1.) Ich benutze das letzte Bit des Types (z.B. int) nicht
    2.) Ich stelle die Zahlen in z.B. 32bit dar und rechne in (32 * 2)bit.

    Ich suche zur Zeit nach einer Möglichkeit, die zweite Methode Compiler unabhängig umzusetzen. Wie ermittle ich hierfür einen geeigneten Datentyp?
    z.B: int (32bit), long (64bit)

    Eine hab ich noch 😃 Wenn bei 64bit Systemen int 32bit und long 64bits bestitzen, wie viele Bits besitzt eine long long Deklarierung?



  • ist compiler abhängig 😉
    wie auch so...

    könnte 64 bit, könnte aber auch mehr sein

    es gibt solche BigInteger Klassen, allerdings gehen die glaube ich über Strings...



  • Skym0sh0 schrieb:

    allerdings gehen die glaube ich über Strings...

    Nur die schlecht programmierten 😉

    Strings sind einfach zu verschwenderisch und zu ineffizient, um damit gut rechnen zu können.



  • Siassei schrieb:

    Ich suche zur Zeit nach einer Möglichkeit, die zweite Methode Compiler unabhängig umzusetzen. Wie ermittle ich hierfür einen geeigneten Datentyp?

    Über welche Plattform reden wir hier: Windows oder eines der OS die die SUS erfüllen?



  • Ist std::bitset<1024> ein Anfang?



  • ~john schrieb:

    Siassei schrieb:

    Ich suche zur Zeit nach einer Möglichkeit, die zweite Methode Compiler unabhängig umzusetzen. Wie ermittle ich hierfür einen geeigneten Datentyp?

    Über welche Plattform reden wir hier: Windows oder eines der OS die die SUS erfüllen?

    Vorraussetzung für meine Antwort: SUS

    Unter anderem. Ich persönlich würde es gerne auf die gängigen Plattformen portieren können. Sprich Windowx XP und Vista, Linux (SuSe, Ubuntu, RedHat, ...), MacOS, HP-UX und Solaris.



  • Siassei schrieb:

    Intressanter Beitrag 😉

    Ich versuche seit ein paar Tagen eine Integer-Klasse zu erstellen, die theoretisch unendlich lange Zahlen darstellen kann. Bei den Rechenoperationen gibt es nun zwei Möglichkeiten Pufferüberläufe zu verhindern.

    1.) Ich benutze das letzte Bit des Types (z.B. int) nicht
    2.) Ich stelle die Zahlen in z.B. 32bit dar und rechne in (32 * 2)bit.

    Ich suche zur Zeit nach einer Möglichkeit, die zweite Methode Compiler unabhängig umzusetzen. Wie ermittle ich hierfür einen geeigneten Datentyp?
    z.B: int (32bit), long (64bit)

    Eine hab ich noch 😃 Wenn bei 64bit Systemen int 32bit und long 64bits bestitzen, wie viele Bits besitzt eine long long Deklarierung?

    Servus,

    programmieren ist mein Hobby und ich würde dieses Problem sehr gerne lösen 🙂 Ich hab mir jetzt mal die Manuals zum gcc rein gezogen. Leider stieß ich hier auf keine geeigneten Lösungsmöglichkeit.

    Hat von euch jemand einen Ansatz?


  • Administrator

    Bist du dazu nicht ein wenig im falschen Thread?
    Naja, ich habe mir so eine riesen Integer Zahl mittels BCD (Binary Coded Decimal) gelöst. Könntest mal dazu suchen gehen oder hier nachschauen:
    http://en.wikipedia.org/wiki/Binary_Coded_Decimal

    Grüssli



  • Ich hoffe nicht 😉

    Wenn ich int bzw. long verwende arbeite ich indirekt mit dem Binary-Code der Dezimalzahlen.

    OK. In <limits> kann ich die Länge von int und long ermitteln. Eine Frage habe ich aber noch 😃 Wie kann ich den Compiler abbrechen, wenn die Bedingung

    ( numeric_limits<int>::digits == numeric_limits<long>::digits ) || ( (numeric_limits<long>::digits - numeric_limits<int>::digits  ) < numeric_limits<int>::digits  )
    

    erfüllt ist?



  • Mit #error kann man einen Fehler auslösen.

    Bei den numeric_limit -Sachen musst du aber aufpassen. Eventuell wird das Ergebnis (z.B. von Funktionen) noch nicht zur Compilezeit ausgewertet, im nächsten C++-Standard geht das erst (mit constexpr )...



  • Und selbst wenn's konstant wäre würde dir #error nichts bringen, das ist der Präprozessor.
    Das Zauberwort heißt static_assert , gibt's aber auch erst im nächsten Standard. Du kannst dafür Boost.StaticAssert verwenden oder dir flugs dein eigenes zusammenhacken:

    template <bool Val>
    struct static_assert {};
    
    template <>
    struct static_assert<false>;
    

    /edit: Zu viel Python in letzter Zeit



  • Wieso würde #error nicht gehen, wenn der Ausdruck compiletime-konstant wäre? Kombiniert mit #if kann man dann eine Abfrage machen...

    Siassei wollte ja den Compiler abbrechen.



  • #error und #if sind Präprozessorausdrücke. Das heißt, das Ganze wird vor dem Kompilieren abgearbeitet. Bei den meisten Compilern ist der Präprozessor sogar ein gesondertes Programm. Konsequenz davon ist, dass er keine C++-Ausdrücke auswerten kann (auch nicht, wenn sie compilezeit-konstant sind), der Präprozessor sieht nur den String, sonst nichts.

    /edit: Und genau der Compiler wird mit einem static_assert auch abgebrochen, nicht aber der Präprozessor 😉



  • Okay, da ist mir wohl ein Denkfehler unterlaufen 😉

    Andere Frage: Wie kann man den Compiler abbrechen? Also wie soll eine eigene Implementation eines static_assert aussehen?



  • Siassei schrieb:

    Unter anderem. Ich persönlich würde es gerne auf die gängigen Plattformen portieren können. Sprich Windowx XP und Vista, Linux (SuSe, Ubuntu, RedHat, ...), MacOS, HP-UX und Solaris.

    Waum nimmst Du nicht int64_t & Co. aus "stdint.h" bzw. "inttypes.h"?
    Desweiteren gibt es Makros, die in der SUS definiert werden, mit denen man testen kann welche Umgebung vorhanden ist. Zu Windows kann ich mich nicht äußern.

    #include <ostream>
    #include <iostream>
    
    #include <unistd.h>
    #include <inttypes.h>
    
    using namespace std;
    
    int main () {
    
    #if _XBS5_ILP32_OFF32 || _XBS5_ILP32_OFFBIG || _XBS5_LP64_OFF64 || _XBS5_LPBIG_OFFBIG
    	cout << "_XBS5_* legacy Makros definiert\n";
    #endif
    
    #if _POSIX_V6_ILP32_OFF32 || _POSIX_V6_ILP32_OFFBIG || _POSIX_V6_LP64_OFF64 || _POSIX_V6_LPBIG_OFFBIG
    	cout << "_POSIX_V6_* Macros definiert\n";
    #endif
    
    #if _POSIX_V6_ILP32_OFF32 || _XBS5_ILP32_OFF32
    	cout << "int, long, pointer und off_t sind 32bit\n\n";
    #elif _POSIX_V6_ILP32_OFFBIG || _XBS5_ILP32_OFFBIG
    	cout << "int, long und pointer sind 32bit, off_t ist mindestens 64bit\n\n";
    #elif _POSIX_V6_LP64_OFF64 || _XBS5_LP64_OFF64
    	cout << "int ist 32bit, long, pointer und off_t sind 64bit\n\n";
    #elif _POSIX_V6_LPBIG_OFFBIG || _XBS5_LPBIG_OFFBIG
    	cout << "int ist 32bit, long, pointer und off_t sind mindestens 64bit\n\n";
    #else
    	cout << "Makros nicht definiert!\n\n";
    #endif
    


  • Nexus schrieb:

    Andere Frage: Wie kann man den Compiler abbrechen? Also wie soll eine eigene Implementation eines static_assert aussehen?

    Steht doch in meinem Posting?!

    Das ist die Minimalvariante. Der Trick ist, dass die Templatespezialisierung für static_assert<false> absichtlich nicht implementiert wird. Instanziiert man dann das Template bricht der Compiler ab.


Anmelden zum Antworten