Matroids Matheplanet Forum Index
Moderiert von Bilbo matph
Matroids Matheplanet Forum Index » Informatik » C - Wertzuweisung
Autor
Universität/Hochschule C - Wertzuweisung
JamesNguyen
Wenig Aktiv Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 08.11.2020
Mitteilungen: 189
  Themenstart: 2021-02-27

Hallo, also ich habe folgendes für mich zusammengetragen int bzw. long (bei mir so habe ich mit sizeof abgefragt) Wertebereich: -2^31 - 2^31 - 1 Dezimal-Literale: -2147483648 - +2147483647 unsigned long Wertebereich: 0 - 2^32 - 1 Dezimal-Literale: 0ul - 4294967295ul long long Wertebereich: -2^63 - 2^63 - 1 Dezimal-Literale: -9223372036854775808LL - +9223372036854775807LL unsigned long long Wertebereich: 0 - 2^64 - 1 Dezimal-Literale: 0ull - 18446744073709551615ull Ich hoffe ich kann nun etwas strukturierter mein Frage stellen. 1. Ich möchte wissen welche der folgende Wertzuweisungen unproblematisch sind un welche dies nicht sind - in diesem Fall dann warum. 2. Welche Zuweisungen werden zwar ausgeführt, weisen der Variable aber nicht den gewünschten Wert der rechten Seite zu? (Was passiert stattdessen?) 3. Welchen Wert und Datentyp haben die rechten "elementaren Ausdrücke" bzw. sind diese überhaupt alle gültig? ich möchte teilweise Werte von oben und teilweise vlt etwas merkwürde Werte einer unsigned long long variable zuordnen: Hinweis: ich habe die Werte so konstruiert das immer den Wertebereich von einem der obigen Datentypen überschreiten positiv und negativ. (ich hab immer die erste oder zweite Stelle um 1 größer gemacht) unsigned long long number = -19000000000000000000 ; unsigned long long number = -9300000000000000000 ; unsigned long long number = -5000000000 ; unsigned long long number = -3000000000 ; unsigned long long number = -1 ; unsigned long long number = 3000000000 ; unsigned long long number = 5000000000 ; unsigned long long number = 9300000000000000000 ; unsigned long long number = 19000000000000000000 ; unsigned long long number = -19000000000000000000ul ; unsigned long long number = -9300000000000000000ul ; unsigned long long number = -5000000000ul ; unsigned long long number = -3000000000ul ; unsigned long long number = -1ul ; unsigned long long number = 3000000000ul ; unsigned long long number = 5000000000ul ; unsigned long long number = 9300000000000000000ul ; unsigned long long number = 19000000000000000000ul ; unsigned long long number = -19000000000000000000LL ; unsigned long long number = -9300000000000000000LL ; unsigned long long number = -5000000000LL ; unsigned long long number = -3000000000LL ; unsigned long long number = -1LL ; unsigned long long number = 3000000000LL ; unsigned long long number = 5000000000LL ; unsigned long long number = 9300000000000000000LL ; unsigned long long number = 19000000000000000000LL ; unsigned long long number = -19000000000000000000ull ; unsigned long long number = -9300000000000000000ull ; unsigned long long number = -5000000000ull ; unsigned long long number = -3000000000ull ; unsigned long long number = -1ull ; unsigned long long number = 3000000000ull ; unsigned long long number = 5000000000ull ; unsigned long long number = 9300000000000000000ull ; unsigned long long number = 19000000000000000000ull ; Vielen Dank für alle Hilfe, James


   Profil
viertel
Senior Letzter Besuch: im letzten Quartal
Dabei seit: 04.03.2003
Mitteilungen: 27784
Wohnort: Hessen
  Beitrag No.1, eingetragen 2021-02-27

zu Frage 1 Alle Wertzuweisungen, die innerhalb des erlaubten Bereiches für den Variablentyp liegen, sind gültig, die anderen nicht. Diese Frage ist also überflüssig. zu Frage 2 Was stattdessen passiert ist irrelevant. Die Zuweisung ist ungültig und fertig. zu Frage 3 Das fragst du am Besten die Doku zu deinem Compiler. Oder den Compiler selbst, der weiß es gewiß. Ansonsten gilt für alle Fragen: Probier es doch einfach aus. Gruß vom ¼


   Profil
JamesNguyen
Wenig Aktiv Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 08.11.2020
Mitteilungen: 189
  Beitrag No.2, vom Themenstarter, eingetragen 2021-02-27

unsigned long long number = -19000000000000000000 ; 17893488147419103232 [Warning] integer constant is too large for its type unsigned long long number1 = -9300000000000000000 ; 9146744073709551616 [Warning] integer constant is so large that it is unsigned [Warning] this decimal constant is unsigned only in ISO C90 unsigned long long number2 = -5000000000 ; 18446744068709551616 unsigned long long number3 = -3000000000 ; 1294967296 [Warning] this decimal constant is unsigned only in ISO C90 unsigned long long number4 = -1 ; 18446744073709551615 unsigned long long number5 = 3000000000 ; 3000000000 [Warning] this decimal constant is unsigned only in ISO C90 unsigned long long number6 = 5000000000 ; 5000000000 unsigned long long number7 = 9300000000000000000 ; 9300000000000000000 [Warning] integer constant is so large that it is unsigned [Warning] this decimal constant is unsigned only in ISO C90 unsigned long long number8 = 19000000000000000000 ; 553255926290448384 [Warning] integer constant is too large for its type unsigned long long number9 = -19000000000000000000ul ; 17893488147419103232 [Warning] integer constant is too large for its type unsigned long long number10 = -9300000000000000000ul ; 9146744073709551616 unsigned long long number11 = -5000000000ul ; 18446744068709551616 unsigned long long number12 = -3000000000ul ; 1294967296 unsigned long long number13 = -1ul ; 4294967295 unsigned long long number14 = 3000000000ul ; 3000000000 unsigned long long number15 = 5000000000ul ; 5000000000 unsigned long long number16 = 9300000000000000000ul ; 9300000000000000000 unsigned long long number17 = 19000000000000000000ul ; 553255926290448384 [Warning] integer constant is too large for its type unsigned long long number18 = -19000000000000000000LL ; 17893488147419103232 [Warning] integer constant is too large for its type unsigned long long number19 = -9300000000000000000LL ; 9146744073709551616 [Warning] integer constant is so large that it is unsigned [Warning] this decimal constant is unsigned only in ISO C90 unsigned long long number20 = -5000000000LL ; 18446744068709551616 unsigned long long number21 = -3000000000LL ; 18446744070709551616 unsigned long long number22 = -1LL ; 18446744073709551615 unsigned long long number23 = 3000000000LL ; 3000000000 unsigned long long number24 = 5000000000LL ; 5000000000 unsigned long long number25 = 9300000000000000000LL ; 9300000000000000000 [Warning] integer constant is so large that it is unsigned [Warning] this decimal constant is unsigned only in ISO C90 unsigned long long number26 = 19000000000000000000LL ; 553255926290448384 [Warning] integer constant is too large for its type unsigned long long number27 = -19000000000000000000ull ; 17893488147419103232 [Warning] integer constant is too large for its type unsigned long long number28 = -9300000000000000000ull ; 9146744073709551616 unsigned long long number29 = -5000000000ull ; 18446744068709551616 unsigned long long number30 = -3000000000ull ; 18446744070709551616 unsigned long long number31 = -1ull ; 18446744073709551615 unsigned long long number32 = 3000000000ull ; 3000000000 unsigned long long number33 = 5000000000ull ; 5000000000 unsigned long long number34 = 9300000000000000000ull ; 9300000000000000000 unsigned long long number35 = 19000000000000000000ull ; 553255926290448384 [Warning] integer constant is too large for its type hier erstmal ein ergebnis ich schreibe aber noch was dazu


   Profil
JamesNguyen
Wenig Aktiv Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 08.11.2020
Mitteilungen: 189
  Beitrag No.3, vom Themenstarter, eingetragen 2021-02-27

also ich habe mir das Ergebnis mit prinf ( "%llu", number.. ) ausgeben lassen bekomme hier jedoch [Warning] unknown conversion type character 'l' in format [-Wformat=] und [Warning] too many arguments for format [-Wformat-extra-args] Der Platzhalter für unsigned long long hat bisher nicht funktioniert. Mit %lld bekomme ich weitere richtige negative werte dazu mich interesiiert halt welcher wert wirklich in der variable steht unabhängig vom Platzhalter


   Profil
JamesNguyen
Wenig Aktiv Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 08.11.2020
Mitteilungen: 189
  Beitrag No.4, vom Themenstarter, eingetragen 2021-02-27

Vielleicht zurück zum eigentlichen Problem \sourceon nameDerSprache \numberson _Bool isFibonacci ( unsigned long long value ) { auto unsigned long long fNminus2 = 0ull , fNminus1 = 1ull , fN = fNminus1 + fNminus2 ; auto unsigned char i ; if ( fNminus2 == value ) { return 1 ; } else if ( fNminus1 == value ) { return 1 ; } else if ( fN == value ) { return 1 ; } { for ( i = 3 ; i < 94 ; i ++ ) { fNminus2 = fNminus1 ; fNminus1 = fN ; fN = fNminus1 + fNminus2; if ( fN == value ) return 1 ; } } return 0 ; } \sourceoff Mich interessiert halt ob irgendein user in der mainfunktion einen aufruf der isFibonacci ( unsigned long long ) machen kann und dem Parameter sozusagen unsinnige Werte außerhalb des unsigned long long -Wertebereich übergeben kann. Und dann aber wegen Überlauf oder sonstigen Sachen zufällig doch eine Fibonacci zahl rauskommt? Wenn das so wäre kann ich das mit if Bedingungen innerhalb der FUnktion überhaupt abfangen? weil bspw. sobald im Parameter unsigned long long value = -4 übergeben wird so wird vlt irgendeine andere zahl daraus im block der funktion weiß ich ja dann gar nicht mehr dass das ursprünglich mal -4 war also wenn aus -4 dann eine fibzahl wird nach der zuweisung dann kommt für meine funktion ja wahr raus..


   Profil
viertel
Senior Letzter Besuch: im letzten Quartal
Dabei seit: 04.03.2003
Mitteilungen: 27784
Wohnort: Hessen
  Beitrag No.5, eingetragen 2021-02-27

Nein! isFibonacci hat keine Chance, zu erkennen, wie der übergebene Wert entstanden ist. Für die Prüfung der Daten ist die aufrufende Funktion zuständig. Sie muß sicherstellen, daß die vom Anwender eingegebenen/übergebenen Werte zulässig sind. Das ist aber ein Schuh, den du dir in deinem jetzigen Lernstadium nicht anziehen willst😎


   Profil
JamesNguyen hat die Antworten auf ihre/seine Frage gesehen.

Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2021 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]