unsigned long int Zahl

  • geschlossen
  • C

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • unsigned long int Zahl

    Hallo Leute

    Bin grad mit einem Programm beschäftigt, bei welchem die eingegebene Zahl nicht grösser als eine unsigned long int Zahl sein darf (4Mia und irgendwas bzw. 8Byte).
    Nun wollt ich das einfach mit einer If abfrage machen:

    Quellcode

    1. if (Zahl > MAX) {
    2. printf("ERROR\n");
    3. }


    Nun ist ja die Maximale Zahl die unsigned long int diese 4Mia grosse Zahl, sprich wenn man eine grössere eingibt, ist diese 4Mia grössere Zahl in der Variable Zahl, da ja keine grössere gespeicher werden kann. Das bedeutet, dass die If anweisung nie zutreffen wird.

    Nun wollt ich fragen, ob man das anders lösen kann. gibts irgend ein Overflow bit welches man abfragen kann oder wie ist das möglich?

    Hoffe auf hilfe;)

    Grüsse Sheester
  • öhm ich glaub meine frage wurde falsch verstanden, ich weiss das unsigned long int 4Bytes gross ist.

    Wenn ich das richtig verstanden habe, soll mir sizeof nichts anderes ausgeben, als die grösse meiner variable. In diesem Fall wäre das 4byte. Das macht er auch.
    Aber ich will ein error ausgeben, sobald eine zahl eingegeben wird, welche grösser ist als die 4 bytes.

    grüsse
  • das ist so leicht nicht möglich.

    wenn du die eingabe des benutzers in einem unsigned long int abspeicherst, geschieht der overflow schon dort.

    was du aber machen könntest ist, die Eingabe in einem unsigned long abzuspeichern, dann einem unsigned long int den wert des unsigned long (dass ja einen weitaus größeren wertebereich hat) zuweisen. Danach prüfst du, ob die werte der zwei Variablen gleich sind, wenn nicht, ist da ein fehler.


    was du aber auch machen könntest (ich weiß nicht, ob das von deinem projekt her geht... ) ist, die GNU MP Bignum lib zu benutzen, mit der man zahlen ohne wertebereich speichern kann
    [COLOR="Green"]"A dream you dream alone is only a dream. A dream you dream together is reality"[/color]

    John Lennon

    [SIZE=1],,,[/SIZE][SIZE=1]*̡͌l̡*,,,,,,,,,,̡̡ ̴̡ı̴̴̡ ,,,,,,,,,*̡͌l̡*,,,,,,,,,,*̡͌l̡*̡̡ ̴̡ı̴̴̡ ̡̡͡|̲̲̲͡͡͡ ̲▫̲͡ ̲̲̲͡͡π̲̲͡͡ ̲̲͡▫̲̲͡͡ ̲|̡̡̡ ̡ ̴̡ı̴̡̡ *̡͌l̡*_,,,,,,,,̡̡ ̴̡ı̴̴̡ ,,,,,,,,*̡͌l̡*,,[/SIZE][SIZE=1],,,[/SIZE][SIZE=1],,,,,,̡̡ ̴̡ı̴̴̡ ,[/SIZE][SIZE=1],,[/SIZE]
    [SIZE="1"][COLOR="Purple"]Up 1[/color][/SIZE] [SIZE="1"] [COLOR="Olive"]Up 2_The_Beatles_Red_Album[/color][/SIZE]
  • Hi, ein Ansatz wäre wie folgt:

    Quellcode

    1. char input[MAX_PATH];
    2. int err = 0;
    3. char* endPtr;
    4. errno = 0;
    5. gets_s(input);
    6. unsigned long num = strtoul(input, &endPtr, 10);
    7. if ((num == 0 && input == endPtr) || (num == ULONG_MAX && errno == ERANGE))
    8. printf("Error");
    9. else
    10. printf("Success, number is %lu", num);
    Alles anzeigen
  • und was ist, wenn ich als zahl 0 oder ULONG_MAX eingegeben habe?
    wäre es nicht besser, die globale variable 'errno' abzufragen, die auf 'ERANGE' gesetzt wird, falls die zahl außerhalb des wertebereichs war?
    [COLOR="Green"]"A dream you dream alone is only a dream. A dream you dream together is reality"[/color]

    John Lennon

    [SIZE=1],,,[/SIZE][SIZE=1]*̡͌l̡*,,,,,,,,,,̡̡ ̴̡ı̴̴̡ ,,,,,,,,,*̡͌l̡*,,,,,,,,,,*̡͌l̡*̡̡ ̴̡ı̴̴̡ ̡̡͡|̲̲̲͡͡͡ ̲▫̲͡ ̲̲̲͡͡π̲̲͡͡ ̲̲͡▫̲̲͡͡ ̲|̡̡̡ ̡ ̴̡ı̴̡̡ *̡͌l̡*_,,,,,,,,̡̡ ̴̡ı̴̴̡ ,,,,,,,,*̡͌l̡*,,[/SIZE][SIZE=1],,,[/SIZE][SIZE=1],,,,,,̡̡ ̴̡ı̴̴̡ ,[/SIZE][SIZE=1],,[/SIZE]
    [SIZE="1"][COLOR="Purple"]Up 1[/color][/SIZE] [SIZE="1"] [COLOR="Olive"]Up 2_The_Beatles_Red_Album[/color][/SIZE]