Definition 'Dereferenzierung'



  • Wenn man unbedingt einen Zeiger in einen Ganzzahltyp casten muss, dann bitte in size_t. Dieser Typ ist garantiert so groß wie ein Zeiger.



  • pumuckl schrieb:

    "Du kannst einem int-Objekt prinzipiell keine Adresse eines anderen in-Objektes zuweisen." - "In ganz bestimmten, nicht portablen und vom Standard nicht garantierten Fällen kann man da per reinterpret_cast was dran drehen."

    Herrlich 😃 .
    Aber du hast natürlich recht. Man soll ja Wissen nach dem Standard vermitteln und nicht nur "meist funktionierende" Ausnahmen lehren.

    Janjan schrieb:

    Wenn man unbedingt einen Zeiger in einen Ganzzahltyp casten muss, dann bitte in size_t. Dieser Typ ist garantiert so groß wie ein Zeiger.

    size_t ist ein typedef auf unsigned int. Mehr nicht.



  • Janjan schrieb:

    Wenn man unbedingt einen Zeiger in einen Ganzzahltyp casten muss, dann bitte in size_t. Dieser Typ ist garantiert so groß wie ein Zeiger.

    Wo steht das?

    FrEEzE2046 schrieb:

    size_t ist ein typedef auf unsigned int. Mehr nicht.

    Wirklich immer?


  • Mod

    pumuckl schrieb:

    FrEEzE2046 schrieb:

    Aber, rein theoretisch kann ein Integer dann auch 8 Bit breit sein.

    Richtig.

    Falsch. Laut C++ Standard müssen die gleichen Limits wie in C89 erfüllt sein und im ANSI C89 Standard, Anhang 4, steht dies:

    ANSI C89 schrieb:

    A.4 IMPLEMENTATION LIMITS

    The contents of a header <limits.h> are given below, in alphabetic
    order. The minimum magnitudes shown shall be replaced by
    implementation-defined magnitudes with the same sign. The values
    shall all be constant expressions suitable for use in #if
    preprocessing directives. The components are described further in
    $2.2.4.2.

    #define CHAR_BIT                         8
             #define CHAR_MAX    UCHAR_MAX  or SCHAR_MAX
             #define CHAR_MIN            0  or SCHAR_MIN
             #define MB_LEN_MAX                       1
             #define INT_MAX                     +32767
             #define INT_MIN                     -32767
             #define LONG_MAX               +2147483647
             #define LONG_MIN               -2147483647
             #define SCHAR_MAX                     +127
             #define SCHAR_MIN                     -127
             #define SHRT_MAX                    +32767
             #define SHRT_MIN                    -32767
             #define UCHAR_MAX                      255
             #define UINT_MAX                     65535
             #define ULONG_MAX               4294967295
             #define USHRT_MAX                    65535
    

    Interessant ist auch, dass CHAR_BIT mindestens 8 ist, bisher hatte ich immer angenommen, dass das Minimum 7 wäre.



  • SeppJ schrieb:

    Falsch. Laut C++ Standard müssen die gleichen Limits wie in C89 erfüllt sein und im ANSI C89 Standard, Anhang 4, steht dies:

    Dir ist schon klar, dass laut diesen Zeilen ein int 16 Bit breit wäre. Muss ich mehr sagen?


  • Mod

    FrEEzE2046 schrieb:

    SeppJ schrieb:

    Falsch. Laut C++ Standard müssen die gleichen Limits wie in C89 erfüllt sein und im ANSI C89 Standard, Anhang 4, steht dies:

    Dir ist schon klar, dass laut diesen Zeilen ein int 16 Bit breit wäre. Muss ich mehr sagen?

    Genau das wollte ich sagen. Aber ja: Du musst mehr sagen, denn ich weiß nicht worauf du hinaus willst 😕 .

    edit: Ahh, ich glaube ich weiß worauf du hinaus willst. Lies nochmal genau:

    ANSI C89 schrieb:

    A.4 IMPLEMENTATION LIMITS

    The contents of a header <limits.h> are given below, in alphabetic
    order. The minimum magnitudes shown shall be replaced by
    implementation-defined magnitudes with the same sign. The values
    shall all be constant expressions suitable for use in #if
    preprocessing directives. The components are described further in
    $2.2.4.2.



  • pumuckl schrieb:

    Wirklich immer?

    size_t ist immer der Rückgabetyp des sizeof() Operators. Laut Standard ist lediglich festgelegt, dass es ein vorzeichenloser integraler Typ ist.

    SeppJ schrieb:

    Genau das wollte ich sagen. Aber ja: Du musst mehr sagen, denn ich weiß nicht worauf du hinaus willst 😕 .

    Ich will dir damit sagen, dass eine Implementierung von int als 32 Bit breiter Typ dann abseits des Standards liegen würde.


  • Mod

    @FrEEzE2046 :
    Ich habe oben noch was editiert, das dich interessieren dürfte.



  • SeppJ schrieb:

    Falsch. Laut C++ Standard müssen die gleichen Limits wie in C89 erfüllt sein und im ANSI C89 Standard, Anhang 4, steht dies: [...]

    Das ist mir auch neu. Ich hab im C++-Standard jetzt nur gefunden, dass es INT_MAX & Co geben muss, nicht aber welchen Beschränkungen sie unterliegen. Kannst du mir den Paragraphen sagen, der angibt dass es die selben Beschränkungen gibt?


  • Mod

    pumuckl schrieb:

    SeppJ schrieb:

    Falsch. Laut C++ Standard müssen die gleichen Limits wie in C89 erfüllt sein und im ANSI C89 Standard, Anhang 4, steht dies: [...]

    Das ist mir auch neu. Ich hab im C++-Standard jetzt nur gefunden, dass es INT_MAX & Co geben muss, nicht aber welchen Beschränkungen sie unterliegen. Kannst du mir den Paragraphen sagen, der angibt dass es die selben Beschränkungen gibt?

    18.2.2.(2) schrieb:

    The contents are the same as the Standard C library header <limits.h>.

    Das wird sich ja wohl nicht nur auf das Vorhandensein der Makros beziehen sondern auch auf ihre Werte, sonst wäre der satz ziemlich witzlos, da die Namen der Makros im Satz davor genannt werden.

    Ich habe diese Klausel aber heute auch das erste Mal gesehen als ich im Zuge dieser Diskussion mal nachgeschaut habe.



  • #define INT_MAX       2147483647    /* maximum (signed) int value */
    #define UINT_MAX      0xffffffff    /* maximum unsigned int value */
    

    Dann dürfte bei einer solchen Definition kein 64 Bit Compiler einen 64 Bit breiten int benutzen.


  • Mod

    FrEEzE2046 schrieb:

    #define INT_MAX       2147483647    /* maximum (signed) int value */
    #define UINT_MAX      0xffffffff    /* maximum unsigned int value */
    

    Dann dürfte bei einer solchen Definition kein 64 Bit Compiler einen 64 Bit breiten int benutzen.

    Die Makros geben die Implementationsdetails an und dienen nicht dazu, diese zu ändern!


  • Mod

    FrEEzE2046 schrieb:

    #define INT_MAX       2147483647    /* maximum (signed) int value */
    #define UINT_MAX      0xffffffff    /* maximum unsigned int value */
    

    Dann dürfte bei einer solchen Definition kein 64 Bit Compiler einen 64 Bit breiten int benutzen.

    korrekt. Bei einer Implementation mit 64bit breiten Interteger müssen die obigen Makros entsprechend angepasst werden, um die für diese Implementation zutreffenden Werte zu liefern. Oder wolltest du etwas anderes ausdrücken?



  • FrEEzE2046 schrieb:

    #define INT_MAX       2147483647    /* maximum (signed) int value */
    #define UINT_MAX      0xffffffff    /* maximum unsigned int value */
    

    Dann dürfte bei einer solchen Definition kein 64 Bit Compiler einen 64 Bit breiten int benutzen.

    Bei einem 64-Bit Compiler werden die mitgelieferten Header dann wohl auch anders aussehen. Der C-Standard gibt da nur an, wie groß die Werte mindestens sein müssen.


Anmelden zum Antworten