Scanf!=enter



  • CStoll schrieb:

    (theoretisch reicht short aus, aber die ANSI Funktionen verwenden int - und andere Anbieter haben sich häufig daran orientiert).

    'int' ist nunmal das einfachste 😉
    aber vielleicht gibt's auch 'nen zusammenhang zwischen 'sizeof('x') == sizeof(int)'?
    :xmas2:



  • Wieso (und auf welche Weise) sollte int denn einfacher sein als short? theoretisch benötigt man 257 verschiedene Werte um alle Rückgaben von getc() und Kollegen unterbringen zu können. Daß es keinen Datentyp mit genau dieser Größe geben kann, ist logisch (der Speicher wird auf Byte genau adressiert), aber warum sollte ein 4-Byte int besser sein als ein 2-Byte short?



  • CStoll schrieb:

    ...aber warum sollte ein 4-Byte int besser sein als ein 2-Byte short?

    das hat mit der breite nix zu tun, die ist sowieso variabel. so'n 'int' entspricht immer dem eingebauten datentyp eines prozessors. 'int' passt in ein register und die cpu kann damit am besten rechnen --> wenig instructions, schneller code.
    :xmas2:



  • ten schrieb:

    CStoll schrieb:

    ...aber warum sollte ein 4-Byte int besser sein als ein 2-Byte short?

    das hat mit der breite nix zu tun, die ist sowieso variabel. so'n 'int' entspricht immer dem eingebauten datentyp eines prozessors. 'int' passt in ein register und die cpu kann damit am besten rechnen --> wenig instructions, schneller code.
    :xmas2:

    Bei einem 8-Bitter ist das aber nicht mehr der Fall.



  • TactX schrieb:

    Bei einem 8-Bitter ist das aber nicht mehr der Fall.

    ist das so?
    darf INT_MAX nicht 127 bzw. UINT_MAX nicht 255 sein?



  • Nein, darf es nicht. der ANSI Standard definiert Mindestgrößen für die elementaren Datentypen, die du nicht unterschreiten darfst - und int hat afaik mindestens 4 Byte (müsste ich nochmal nachschlagen).



  • na, 4 bytes bestimmt nicht. man begegnet öfters auch 16bittigen 'ints'.
    aber ich dachte immer dass 'int' in das schema:

    sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)
    

    passen muss. und danach ist ja nur festgelegt, dass 'int' mindestens so gross wie 'char' sein muss und diese konstanten in 'limits.h' dafür sind ja allesamt 'implementation defined'...
    :xmas2:



  • Hi
    Wenn nach deinem Muster ein char z.B. 8 bit groß ist, ein short dann genausogroß usw., dann ist ein long doch auch 8 bit groß?? Jedenfalls passt das so auch in dein Schema.

    Ich hab chars immer als 8 bit gesehen, shorts als 16, int mind. 16 und long mind. 32 bit.
    Unter www.pronix.de steht das auch so (sry, hab keine Ahnung wo ich ne richtige Referenz finde^^)



  • Wie gesagt - die genauen Werte muß ich nachschlagen (kann ich erst heute abend machen), aber int ist definitiv größer als 8 Bit.



  • CStoll schrieb:

    ...aber int ist definitiv größer als 8 Bit.

    hab' gerade mal im ISO/IEC 9899:1999 rumgesucht, aber auch nix gefunden, was deine vermutung belegen würde. eher sowas:

    A ‘‘plain’’ int object has the natural size suggested by the
    architecture of the execution environment (large enough to contain any value in the range INT_MIN to INT_MAX as defined in the header <limits.h>).

    was ja eher dafür sprechen würde, dass ein 'int' auf 'ner 8-bit maschine auch 8 bits haben soll. man könnte vielleicht meinen, das wird in 'limits.h' festgelegt, aber dazu steht:

    The minimum magnitudes shown shall be replaced by implementation-defined magnitudes with the same sign.

    also auch wieder alles variabel...
    :xmas2:


  • Mod

    ten schrieb:

    CStoll schrieb:

    ...aber int ist definitiv größer als 8 Bit.

    hab' gerade mal im ISO/IEC 9899:1999 rumgesucht, aber auch nix gefunden, was deine vermutung belegen würde.

    Abschnitt 5.2.4.2.1, der (abgesehen von den Konstanten für long long, die dort fehlen) identisch mit dem für C++ relevanten von C90 ist.



  • camper schrieb:

    ten schrieb:

    CStoll schrieb:

    ...aber int ist definitiv größer als 8 Bit.

    hab' gerade mal im ISO/IEC 9899:1999 rumgesucht, aber auch nix gefunden, was deine vermutung belegen würde.

    Abschnitt 5.2.4.2.1, der (abgesehen von den Konstanten für long long, die dort fehlen) identisch mit dem für C++ relevanten von C90 ist.

    ach, das meinst du:

    Their implementation-defined values shall be equal or greater in magnitude
    (absolute value) to those shown, with the same sign.

    merci 😉
    :xmas2:


  • Mod

    sizeof(char)==sizeof(long)
    kann allerdings trotzdem zutreffen. Nähmlich dann, wenn char wenigstens 32 bits hat. Es gibt also wirklich nicht sehr viele Garantien. EOF muss insofern auch nicht außerhalb des Wertebereichs von char liegen, notwendig ist nur, dass es ein konstanter Ausdruck vom Typ int und negativ ist.



  • camper schrieb:

    sizeof(char)==sizeof(long)
    kann allerdings trotzdem zutreffen.

    ja, das kenne ich von so'nem exotischen compiler für texas instruments 32bitter 😞
    deswegen hätt's mich auch nicht gewundert, wenn 'int' 8 bits haben dürfte...
    :xmas2:


Anmelden zum Antworten