Matroids Matheplanet Forum Index
Moderiert von Bilbo matph
Matroids Matheplanet Forum Index » Informatik » C - Wertzuweisung
Druckversion
Druckversion
Antworten
Antworten
Autor
Universität/Hochschule C - Wertzuweisung
JamesNguyen
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 08.11.2020
Mitteilungen: 187
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  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



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
viertel
Senior Letzter Besuch: im letzten Monat
Dabei seit: 04.03.2003
Mitteilungen: 27783
Herkunft: Hessen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  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 ¼


-----------------
Bild



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
JamesNguyen
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 08.11.2020
Mitteilungen: 187
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  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



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
JamesNguyen
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 08.11.2020
Mitteilungen: 187
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  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



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
JamesNguyen
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 08.11.2020
Mitteilungen: 187
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.4, vom Themenstarter, eingetragen 2021-02-27


Vielleicht zurück zum eigentlichen Problem

  1. _Bool isFibonacci ( unsigned long long value )
  2. {
  3. auto unsigned long long fNminus2 = 0ull , fNminus1 = 1ull , fN = fNminus1 + fNminus2 ;
  4.  
  5. auto unsigned char i ;
  6.  
  7. if ( fNminus2 == value )
  8. {
  9. return 1 ;
  10. }
  11. else if ( fNminus1 == value )
  12. {
  13. return 1 ;
  14. }
  15. else if ( fN == value )
  16. {
  17. return 1 ;
  18. }
  19. {
  20. for ( i = 3 ; i < 94 ; i ++ )
  21. {
  22. fNminus2 = fNminus1 ;
  23. fNminus1 = fN ;
  24. fN = fNminus1 + fNminus2;
  25.  
  26. if ( fN == value ) return 1 ;
  27. }
  28. }
  29.  
  30. return 0 ;
  31. }


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..



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
viertel
Senior Letzter Besuch: im letzten Monat
Dabei seit: 04.03.2003
Mitteilungen: 27783
Herkunft: Hessen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  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😎



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
JamesNguyen hat die Antworten auf ihre/seine Frage gesehen.
Neues Thema [Neues Thema] Antworten [Antworten]    Druckversion [Druckversion]

 


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]