Aufgabe



  • Hi,

    Wird im Vergleich automatisch der linke dem rechten Ausdruck angepasst oder wird signed automatisch im Vergleich zu unsigned?

    MfG Eisflamme



  • Die Schleife wird nicht durchlaufen, weil der Zähler i im Vergleich als vorzeichenlos gesehen wird. Da er es aber eigentlich ist, ist das erste Bit gesetzt, und das führt dazu, dass i > 1000 ist.

    Um 1001 durchlaüfe zu erhalten, muss man den Vergleich so schreiben:

    uint limit = 1000;
    for(int i=-1; i < [b](int)[/b]limit; i++);
    

    cu
    -LC



  • Eisflamme schrieb:

    Hi,

    Wird im Vergleich automatisch der linke dem rechten Ausdruck angepasst oder wird signed automatisch im Vergleich zu unsigned?

    MfG Eisflamme

    dies hängt mit der implizierten typkonvertierung zusammen.

    gilt nicht bei zuweisungen:
    - grundsätzlich wird char und short zu int konvertiert

    - ist einer der operanden vom typ long double, so wird der andere auch in long double umgewandelt. das resultat hat den typ long double.

    - ist einer der operanden vom typ double, so wird der andere auch in double umgewandelt. das resultat hat den typ double.

    - sonst gilt: ist einer der operanden vom typ long, so wird der andere auch in long umgewandelt. das resultat hat den typ long.

    - sonst gilt: ist einer der operanden vom typ long long, so wird der andere auch in long long umgewandelt. das resultat hat den typ long long.

    - sonst gilt: ist einer der operanden vom typ unsigned int, so wird der andere auch in unsigned int umgewandelt. das resultat hat den typ unsigned int.

    gilt bei zuweisungen:
    - typ des operanden, an den zugewiesen wird (lvalue), wird nicht verändert

    - typ des zugewiesenen wertes wird entsprechend lvalue geändert

    - alternativ formuliert: der typ des empfängers dominiert die gesamte zuweisung

    - ist der typ des lvalue "kleiner" als der typ des rvalue, so wird entweder gerundet oder abgeschnitten (implementierungsabhängig)

    grüße,

    sternenstaub



  • Eisflamme schrieb:

    gilt nicht bei zuweisungen:
    - grundsätzlich wird char und short zu int konvertiert

    - ist einer der operanden vom typ long double, so wird der andere auch in long double umgewandelt. das resultat hat den typ long double.

    - ist einer der operanden vom typ double, so wird der andere auch in double umgewandelt. das resultat hat den typ double.

    - sonst gilt: ist einer der operanden vom typ long, so wird der andere auch in long umgewandelt. das resultat hat den typ long.

    - sonst gilt: ist einer der operanden vom typ long long, so wird der andere auch in long long umgewandelt. das resultat hat den typ long long.

    - sonst gilt: ist einer der operanden vom typ unsigned int, so wird der andere auch in unsigned int umgewandelt. das resultat hat den typ unsigned int.

    Gut zu wissen 😉

    cu
    -LC



  • Hi,
    wie muss ich das verstehen???

    "int" wird in "unsigned int" umgewandelt. Da aber...

    int i = -1
    

    ...ist, kann ich doch "i" nich in "unsigned int" umwandeln, da "unsigned int "
    einen Zahlenbereich von 0 bis 65535 bzw. 4294967295 entspricht.

    Und warum ist dann "-1" plötzlich größer als 1000 😕

    Ich verstehe das nicht!!!
    Schreibt mir bitte, ob ich irgendwas falsch verstanden habe...

    Ciao...
    euer zocker001 😉



  • Naja, es wird halt einfach die entsprechende Bitkombination als unsigned int, statt als int interpretiert. Im Prinzip kannst Du es Dir so vorstellen, daß das höchstwertige Bit das Vorzeichen angibt. Das ist bei -1 gesetzt. Bei unsigned gibt's aber kein Vorzeichenbit, sodaß es dort für die Angabe der Zahl verwendet wird. Also ist es dort gesetzt und ergibt einen sehr hohen Zahlenwert.

    Obige Beschreibung ist nicht ganz korrekt, weil die Zahlen im Rechner etwas anders gespeicher werden. Man hätte, wenn man nur ein Vorzeichenbit benutzen würde diverse Probleme, wie zum Beispiel zwei nullen: +0, -0. Daher wird im Rechner normalerweise das 2er-Komplement verwendet. Aber das Problem an sich wird hoffe ich trotzdem deutlich.

    MfG Jester



  • hallo,

    hier mal eine kleine übersicht wie die zahlen "intern" dargestellt werden:

    int (4 byte):
    dezimal                binär
    +1                    00000000 00000000 00000000 00000001
     0                    00000000 00000000 00000000 00000000
    -1                    11111111 11111111 11111111 11111111
    
    unsigned int (4 byte):
    dezimal                binär
    +4.294.967.295        11111111 11111111 11111111 11111111
    +1                    00000000 00000000 00000000 00000001
     0                    00000000 00000000 00000000 00000000
    -1                    gibt es bei unsigned (vorzeichenlos) int nicht
    

    fällt dir was auf? wenn man das bitmuster von -1 eines int als unsigned int betrachtet ergibt es einen ganz anderen wert... man ist bei einem computer eben ein wenig eingeschränkt in der informationsdarstellung, kondensatoren im hauptspeicher sind eben entweder geladen (1) oder ungeladen (0). bei den anderen speichermedien eines rechners ist es analog dazu, zb bei einer festplatte die magnetfelder entweder in die eine oder die entgegengesetzte richtung gepolt... deshalb kommt es darauf an als was man die daten interpretiert und auch was alles zu dem datenblock gehört.

    eine negative zahl ergibt sich aus dem 2er-komplement einer positiven zahl +1.
    dies alles gilt jedoch nur bei ganzzahligen datentypen, char, int etc...
    für floats, doubles etc ist es ein wenig komplizierter, die bestehen aus einem vorzeichenbit, mantisse und einem exponent. wenn du dazu genaueres wissen möchtest müßte ich es nochmal nachlesen wie das genau berechnet wird.

    hoffe etwas licht ins dunkel gebracht zu haben,

    sternenstaub



  • Sternenstaub schrieb:

    eine negative zahl ergibt sich aus dem 2er-komplement einer positiven zahl +1.

    Nein, negative Zahl gleich 2er-Komplement der positiven Zahl. 2er-Komplement = 1erKomplement + 1, 1er-Komplement = alle Bits rumdrehen.

    MfG Jester



  • Jester schrieb:

    Nein, negative Zahl gleich 2er-Komplement der positiven Zahl. 2er-Komplement = 1erKomplement + 1, 1er-Komplement = alle Bits rumdrehen.

    MfG Jester

    ok, da hast du natürlich recht! die vorlesungen, die ich zu diesem thema gehört habe, sind doch schon etwas länger her. und habe das seitdem auch nie wieder gebraucht... 🙄

    grüße,

    sternenstaub



  • Hi,

    seid mir nich böse, wenn es bei mir schon wieder ein paar Unklarheiten gibt!!!

    Hier nochmal die Tabelle von Sternenstaub:

    int (4 byte):
    dezimal                binär
    +1                    00000000 00000000 00000000 00000001
     0                    00000000 00000000 00000000 00000000
    -1                    11111111 11111111 11111111 11111111
    
    unsigned int (4 byte):
    dezimal                binär
    +4.294.967.295        11111111 11111111 11111111 11111111
    +1                    00000000 00000000 00000000 00000001
     0                    00000000 00000000 00000000 00000000
    -1                    gibt es bei unsigned (vorzeichenlos) int nicht
    

    Wenn die Zahl "-1" als int das Bitmuster "11111111 11111111 11111111 11111111" hat, wird sie dann bei der Umwandlung in unsigned int unverändet übernommen??? Denn dann würde mir nämlich ein 💡 aufgehen, weil das selbe Bitmuster dort den Zahlenwert "+4.294.967.295" entspricht, oder???

    Wenn das wieder nich korrekt ist, verstehe ich die Welt nicht mehr... 😃
    Bitte schreibt mir, wenn ihr Fehler entdeckt...

    Danke für eure Unterstützung...

    Ciao
    euer zocker001 🙂 🙂 🙂



  • Ja !



  • 💡 💡 💡 💡 💡

    Danke für eure Hilfe!!! 🙂
    Ciao, euer zocker001 😉



  • im VC6 läuft das loop nicht 1001 sondern 0 mal durch 🤡


Anmelden zum Antworten