Multiplikation mit short int * short int über short int Zahlenbereich hinaus



  • Hallo, habe gerade folgende fkt. geschrieben:

    *************

    #include <iostream>
    
    short Mult (unsigned short x, unsigned short y)
    
    {
        return (x*y);
    }
    int main()
    {
    std::cout << Mult(256,257);
    std::cin.get();
    
    return 0;
    }
    

    ****************

    256 * 257 ist > 65792. Das ist 257 größer als die laut "jetzt lerne ich c++ buch" größte short int unsigned = 65535. Aber im standardausgabemedium von borland c++builder x krieg ich 256 raus. Ich hatte einen Programmabsturz erwartet. Aber wenn er (bei unkritischer Betrachtung) einen zunächst "vertrauensvoll" wirkenden Wert auswirft (256) ist die nutzung von unsigne short int ggü unsigned long int doch eh nimmer zu emfpehlen oder??.

    weil ich 256 rauskrieg müsste 65536 die größte short unsigned int sein. aber da auch 0 unsigned short int ist hätte die menge der unsigned short ints dann 65537 zahlen > 2exp16 --> > 2 Byte. also falsche Aussage. Wer kllärt mich auf?

    ***************************

    Frage: in excel 03 gibt´s 65536 zeilen. hat das was mit der menge der short unsigend int zahlen zu tun?

    gruss kasimirle 😕



  • Also, unsigned short ist in der Regel zwei bytes groß,
    daher kann 2^16 = 65536 verschiedene Werte annehmen, also 0 bis 2^16 - 1.
    Betrachten wir jetzt 256 * 257, dann ist das 256256 + 256 = 2 ^ 16 + 256.
    256
    256 = 2^16, da erhälst du wieder 0. also 2^16-1 der größte Wert aus dem Wertebereich von unsigned short. Wenn man das ganze hexadezimal betrachet, dann sieht das noch schöner aus:
    0x100 = 256, 0x101 = 257, 0x10000 = 2^16, 0x10100 = 2^16 + 256
    0x100 * 0x101 = 0x10100 (intern werden jetzt einfach nur die unteresten 4 hexadezimal ziffern betrachet, entsprechen 16 bits)
    0x100 * 0x101 = 0x0100 = 256.

    Aber wenn er (bei unkritischer Betrachtung) einen zunächst "vertrauensvoll" wirkenden Wert auswirft (256) ist die nutzung von unsigne short int ggü unsigned long int doch eh nimmer zu emfpehlen oder??.

    Also ich persönlich verwende selten shorts, ihr einziger vorteil ist imho auch, das sie halb soviel speicher benötigen, wie ein int. Multiplikation von shorts, ist in der Regel keine gute Idee, außer man weiß, was man tut. Der Wertebereich ist multiplikativ schnell überschritten.

    Frage: in excel 03 gibt´s 65536 zeilen. hat das was mit der menge der short unsigend int zahlen zu tun?

    Vielleicht, vielleicht auch nicht. Es kann auch daran liegen, das es maximal
    2^32 zellen = 65536 zeilen * 65536 spalten geben kann.

    MfG
    DDR-RAM


  • Mod

    Bei arithmetischen Operationen findet immer zunächst eine integrale Promotion auf int (bzw. unsigned wenn diese dieselbe Größe wie der Typ des Operanden haben) statt. Folglich ist das Ergebnis der Multiplikation mit x=256 und y=257 (tatsächlicher Wert: 65792) in jedem praktischen Falle definiert:
    Auf Plattformen mit 16bit ints ist das Ergebnis ein unsigned int mit dem Wert 256;
    auf allen anderen Plattformen ist es ein int bzw. unsigned int mit dem Wert 65792

    Ausnahme höchtens ein hypothetisches System mit 16bit shorts und 17bit ints - hier wäre tatsächlich die Multiplikation selbst undefiniert.

    Problematisch ist die Rückgabe des Ergebnisses. Die Konvertierung in einen vorzeichenbehafteten Typen eines Wertes, der außerhalb des Wertebereichs dieses Typs liegt, ist undefiniert. Definiertes Verhalten erhältst du durch konsequente Verwendung vorzeichenloser Operanden:

    unsigned short Mult (unsigned short x, unsigned short y)
    
    {
        return unsigned(x)*y;
    }
    int main()
    {
    std::cout << Mult(256,257);
    std::cin.get();
    
    return 0;
    }
    

    Hier ist das Ergebnis entweder 256 auf Systemen mit 16bit shorts und 65792 sonst.


Anmelden zum Antworten