xNeTworKx: C / Wertbereich ?

#include <h.allo>

Es gibt etwas, was ich bei C ganz und gar nicht verstehe. Man muss sich ja um die Speicherzuteilung selbst kümmern. Jetzt sind in den Buchbeispielen die Variablen zB mit int x deklariert.
Es steht erkärt, daß int, Ganzzahl bedeutet, mit einem Wertbereich von -32768 bis 32767.
Soll das jetzt bedeuten, daß wenn ich eine Eingabeaufforderung habe, und eine Zahl, die mit int deklariert wurde, nur eine Zahl zwischen diesen Werten eingeben darf, oder bedeutet das doch etwas ganz anderes ?
Von der Logik her, müsste es doch etwas anderes bedeuten, weil ich kann doch im Programm vorher nicht wissen, was ein User eingibt?
Deswegen wollt ich jetzt mal gerne wissen, was dieser Wertbereich bedeutet?

  1. Hallo,

    Es steht erkärt, daß int, Ganzzahl bedeutet, mit einem Wertbereich von -32768 bis 32767.
    Soll das jetzt bedeuten, daß wenn ich eine Eingabeaufforderung habe, und eine Zahl, die mit int deklariert wurde, nur eine Zahl zwischen diesen Werten eingeben darf, oder bedeutet das doch etwas ganz anderes ?

    Sagt doch schon das Wort Wertebereich aus.

    Von der Logik her, müsste es doch etwas anderes bedeuten, weil ich kann doch im Programm vorher nicht wissen, was ein User eingibt?

    Du wirst doch wohl abfragen koennen, ob die eingegebene Zahl in diesem Bereich liegt, oder?

    Deswegen wollt ich jetzt mal gerne wissen, was dieser Wertbereich bedeutet?

    2^16 ganze Zahlen: negative Werte von -32768 bis -1, die 0 sowie positive Werte 1 bis 32767.

    MfG, Thomas

  2. Es gibt etwas, was ich bei C ganz und gar nicht verstehe. Man muss sich ja um die Speicherzuteilung selbst kümmern. Jetzt sind in den Buchbeispielen die Variablen zB mit int x deklariert.
    Es steht erkärt, daß int, Ganzzahl bedeutet, mit einem Wertbereich von -32768 bis 32767.
    Soll das jetzt bedeuten, daß wenn ich eine Eingabeaufforderung habe, und eine Zahl, die mit int deklariert wurde, nur eine Zahl zwischen diesen Werten eingeben darf, oder bedeutet das doch etwas ganz anderes ?
    Von der Logik her, müsste es doch etwas anderes bedeuten, weil ich kann doch im Programm vorher nicht wissen, was ein User eingibt?

    Der Speicher vom Computer ist in einzelne Speicherzellen unterteilt, besser bekannt als Bytes. Wenn Du "int x" schreibst, werden für die Variable x zwei Bytes reserviert, nicht mehr und nicht weniger. Zwei Bytes entsprechen insgesamt 16 Bits, das sind dann 2^16=65536 mögliche Werte, oder gerecht zwischen negativ und positiv aufgeteilt: -32768 bis +32767.

    Das ist alles. Mehr geht nicht, weil kein Platz da ist.

    Wenn Du versuchst, dieser Variable eine größere Zahl (vom Platzbedarf her) zuzuweisen, enthält diese Variable dann entweder irgendeinen Wert innerhalb des möglichen Bereichs (aber ganz bestimmt nicht die gewünschte Zahl) oder das Laufzeitsystem haut Dir diese Zahl mehr oder weniger freundlich um die Ohren ("overflow" oder "out of range").

    Gruß,
      soenk.e

    1. Hoi,

      Der Speicher vom Computer ist in einzelne Speicherzellen unterteilt, besser
      bekannt als Bytes. Wenn Du "int x" schreibst, werden für die Variable x zwei
      Bytes reserviert, nicht mehr und nicht weniger.

      Tatsache ist, dass das Implementations-Abhaengig ist. Die Regel lautet:
      mindestens zwei Bytes, hoechstens vier Bytes. int muss mindestens so gross wie
      ein 'short' sein, aber maximal so gross wie ein 'long'. Haeufig entspricht int
      der natuerlichen Groesse auf einem PC.

      Wenn Du versuchst, dieser Variable eine größere Zahl (vom Platzbedarf her)
      zuzuweisen, enthält diese Variable dann entweder irgendeinen Wert
      innerhalb des möglichen Bereichs

      Nicht irgendeinen, diesen Wert kann man berechnen.

      Gruesse aus dem schoenen LH,
       c.j.k

  3. Hi,

    Es gibt etwas, was ich bei C ganz und gar nicht verstehe. Man muss sich ja um die Speicherzuteilung selbst kümmern. Jetzt sind in den Buchbeispielen die Variablen zB mit int x deklariert.
    Es steht erkärt, daß int, Ganzzahl bedeutet, mit einem Wertbereich von -32768 bis 32767.

    Bedeutet das Du nur ganzzahlige Werte speichern kannst. In deinem Fall ist int 16 Bit groß wobei das Bit 15 das signifikante Bit (Vorzeichen) darstellt. Anders ausgedrückt, Du kannst darin nur ganzahlige Werte von -32768 bis 32767 speichern, weil mehr geben die 16 Bit nicht her. Integer kann aber auch 32 Bit groß sein, dass kommt darauf an, für welches System Du programmierst.

    Soll das jetzt bedeuten, daß wenn ich eine Eingabeaufforderung habe, und eine Zahl, die mit int deklariert wurde, nur eine Zahl zwischen diesen Werten eingeben darf, oder bedeutet das doch etwas ganz anderes ?

    Was Du eingibst ist irrelevant, deine Variable (int) zur Aufnahme des Wertes kann nun mal nur den angesprochenen Bereich abdecken. Wie die Eingabe umgewandelt wird und was Da rauskommt steht auf'nem anderen Blatt. Gibst Du keine Zahlen ein so wird in der Variablen der Wert 0 stehen. Gibst Du 123456789 ein so wird das in ein int umgewandelt, allerdings wird die Variable nicht 123456789 enthalten, da 16 Bit. Sprich wenn der Tank voll ist und Du noch mehr Sprit reinläßt, dann geht viel daneben. Das ändert aber nichts an der Tatsache das Sprit im Tank ist.

    Von der Logik her, müsste es doch etwas anderes bedeuten, weil ich kann doch im Programm vorher nicht wissen, was ein User eingibt?
    Deswegen wollt ich jetzt mal gerne wissen, was dieser Wertbereich bedeutet?

    Du weißt auch nicht was der User eingibt aber Du weißt was Du haben willst und dementsprechend verarbeitest Du die Eingabe. Was der User eingibt ist egal, Du bzw. dein Programm will nur ein int und wenn der Wert nicht stimmt, na dann hat der User eben Pech, schließlich will er durch das Programm was erreichen und nicht umgekehrt.

    Btw: Warum "Zur Info" als Topic ?

    hth
    sabine

    1. #include <h.allo>

      Ok danke, alle klar.

  4. Hallo,

    Es steht erkärt, daß int, Ganzzahl bedeutet, mit einem Wertbereich von -32768 bis 32767.

    Wobei das nicht die ganze Wahrheit ist. Welchen Wertebereich int wirklich hat, hängt vom Compiler ab. Bei manchen ist es 'short int' also  eine vorzeichenbehaftete 16-Bit Variable, bei manchen ist es 'long int', also eine vorzeichenbehaftete 32-Bit Variable. Zweiteres ist heute eigentlich AFAIK die Regel. Damit ergibt sich ein Wertebereich von -2147483648 bis 2147483647. IMHO ist dieses Compiler-abhängige VErhalten eines der größten Mankos von C.
    Viele Programmierer definieren daher die Datentypen immer mit long bzw short, da deren Wertebereich immer klar festgelegt ist.

    Soll das jetzt bedeuten, daß wenn ich eine Eingabeaufforderung habe, und eine Zahl, die mit int deklariert wurde, nur eine Zahl zwischen diesen Werten eingeben darf, oder bedeutet das doch etwas ganz anderes ?

    Ja, das heißt es.

    Von der Logik her, müsste es doch etwas anderes bedeuten, weil ich kann doch im Programm vorher nicht wissen, was ein User eingibt?

    Das überprüfen von Wertebereichen liegt immer im Bereich des Programmierers. Der Grund ist IMHO in einer verbesserten Performance zu suchen, da es eigentlich nur wenig Fälle gibt (Datenübernahme von Außen), in denen Variablen Werte annehmen könnten, die nicht innerhalb des Wertebereichs liegen.

    Deswegen wollt ich jetzt mal gerne wissen, was dieser Wertbereich bedeutet?

    Die größte bzw. kleinste Zahl, die mit diesen Datentyp darstellbar ist.

    Übrigens sind verschiedene Datentypen, und damit verschiedene Wertebereiche, in den Programmiersprachen die Regel.
    Scriptsprachen wie Perl oder PHP bilden eher die Ausnahme.

    Grüße
      Klaus

    1. Hoi,

      IMHO ist dieses Compiler-abhängige VErhalten eines der größten Mankos von C.
      Viele Programmierer definieren daher die Datentypen immer mit long bzw
      short, da deren Wertebereich immer klar festgelegt ist.

      Das ist IMHO Unfug. Die Grenzen eines int sind ganz klar definiert. Wenigstens
      short, maximal long. Die Compiler-Freiheiten haben naemlich ganz strikte
      Grenzen.

      Gruesse aus dem schoenen LH,
       c.j.k

      1. Moin!

        Das ist IMHO Unfug. Die Grenzen eines int sind ganz klar definiert. Wenigstens
        short, maximal long. Die Compiler-Freiheiten haben naemlich ganz strikte
        Grenzen.

        sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)
        oder so aehnlich lautet AFAIK der Constraint.
        Na gut, aber wie sind short und long festgelegt? sizeof(long) == 4? Eher nicht, denn int richtet sich ja nach der Maschinenwortgroesse der Plattform. Wenn die 64 Bit ist, muss long mindestens auch so gross sein. Also kann ein int schon sehr variieren zwischen den Plattformen (zwischen 2 und 8 Bytes auf den gaengigsten). Ich finde das nicht ganz unerheblich und stimme da eher Klaus zu. int empfiehlt sich eher dann, wenn man davon ausgehen kann, dass der auch auf "kleinen" Plattformen noch gross genug ist, oft z.B. fuer Zaehlvariablen. Dann kann man aber durchaus zu int raten, da viele Prozessoren mit der fuer sie natuerlichen Groesse besonders effizient arbeiten koennen.

        So long

        --
        Manchmal habe ich den verdacht, dass meine 'facility-managerin' (aka:putzfrau) mehr ahnung von 'usability' hat als all ihr super-hippen 'web-designer'.
            -- http://www.heise.de/newsticker/foren/go.shtml?msg_id=520197&forum_id=10861&read=1

        1. Hoi,

          sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)
          oder so aehnlich lautet AFAIK der Constraint.

          Ja.

          Na gut, aber wie sind short und long festgelegt? sizeof(long) == 4?

          AFAIK ja.

          Eher nicht, denn int richtet sich ja nach der Maschinenwortgroesse der
          Plattform.

          Nein; zumindest steht das in meinem K&R anders (Ausgabe von 1990).

          Gruesse aus dem schoenen LH,
           c.j.k

          1. Re there!

            Eher nicht, denn int richtet sich ja nach der Maschinenwortgroesse der
            Plattform.

            Nein; zumindest steht das in meinem K&R anders (Ausgabe von 1990).

            Aber aus irgendeinem Grund hofft doch alle Welt, dass das Jahr2038-Problem, das aus den gaengigen 4 byte grossen ints resultiert, sich mit Verbreitung der 64Bit-Architekturen von alleine in Wohlgefallen aufloest. Und welche Typen sind denn dann auf diesen Architekturen 64 Bit gross? Es muss doch mindestens einen eingebauten geben, oder?

            So long

            --
            Manchmal habe ich den verdacht, dass meine 'facility-managerin' (aka:putzfrau) mehr ahnung von 'usability' hat als all ihr super-hippen 'web-designer'.
                -- http://www.heise.de/newsticker/foren/go.shtml?msg_id=520197&forum_id=10861&read=1

            1. Hoi,

              Eher nicht, denn int richtet sich ja nach der Maschinenwortgroesse der
              Plattform.

              Nein; zumindest steht das in meinem K&R anders (Ausgabe von 1990).

              Aber aus irgendeinem Grund hofft doch alle Welt, dass das Jahr2038-Problem,
              das aus den gaengigen 4 byte grossen ints resultiert, sich mit Verbreitung der
              64Bit-Architekturen von alleine in Wohlgefallen aufloest. Und welche Typen
              sind denn dann auf diesen Architekturen 64 Bit gross? Es muss doch mindestens
              einen eingebauten geben, oder?

              Wie waers mit

              long long long

              ;-) Im Moment sagt der gcc auf meiner 32Bit-maschine dazu

              test.c:5: `long long long' is too long for GCC

              Gruesse aus dem schoenen LH,
               c.j.k

          2. Hallo,

            Na gut, aber wie sind short und long festgelegt? sizeof(long) == 4?

            AFAIK ja.

            Nein.
            Wie die Größen der einzelnen Typen festgelegt sind ist z.B. für Intergertypen in C-99 wie folgt definiert:

            6.2.5 Types
            [...]
            5 An object declared as type signed char occupies the same amount of storage as a plain'' char object. A plain'' int object has the natural size suggested by the architecture of the execution environment (large enough to contain anyvalue in the range INT_MIN to INT_MAX as defined in the header <limits.h>).
            [...]

            Danach ist also zu prüfen und z.B. via typedef o.ä. festzulegen.
            (Normalerweise geht es aber schon bei der Makefilegenerierung)

            Eher nicht, denn int richtet sich ja nach der Maschinenwortgroesse der
            Plattform.

            Nein; zumindest steht das in meinem K&R anders (Ausgabe von 1990).

            Es gilt ISO, nicht K&R! ;-)

            Aber ich stimme den Kollegen hier durchaus zu: es ist ein verdammtes Kreuz mit den verschiedenen Architekturen in Verbindung mit C.

            so short

            Christoph Zurnieden

            1. Hoi,

              Na gut, aber wie sind short und long festgelegt? sizeof(long) == 4?

              AFAIK ja.

              Nein.
              Wie die Größen der einzelnen Typen festgelegt sind ist z.B. für
              Intergertypen in C-99 wie folgt definiert:

              6.2.5 Types
              [...]
              5 An object declared as type signed char occupies the same amount of
              storage as a plain'' char object. A plain'' int object has the natural
              size suggested by the architecture of the execution environment (large
              enough to contain anyvalue in the range INT_MIN to INT_MAX as defined in
              the header <limits.h>).
              [...]

              Danach ist also zu prüfen und z.B. via typedef o.ä. festzulegen.
              (Normalerweise geht es aber schon bei der Makefilegenerierung)

              Interessant. Dann luegt der K&R anscheinend.

              Eher nicht, denn int richtet sich ja nach der Maschinenwortgroesse der
              Plattform.

              Nein; zumindest steht das in meinem K&R anders (Ausgabe von 1990).

              Es gilt ISO, nicht K&R! ;-)

              Der K&R haelt sich eigentlich weitestgehend an den ISO-Standard, AFAIK ;-)
              Wo kriegt man den eigentlich her?

              Aber ich stimme den Kollegen hier durchaus zu: es ist ein verdammtes Kreuz
              mit den verschiedenen Architekturen in Verbindung mit C.

              Dann nimm halt Perl ;-)

              Gruesse aus dem schoenen LH,
               c.j.k

              1. Hallo,

                Danach ist also zu prüfen und z.B. via typedef o.ä. festzulegen.
                (Normalerweise geht es aber schon bei der Makefilegenerierung)

                Interessant. Dann luegt der K&R anscheinend.

                Das war jetzt die neueste Version (1999/2000). Habe die Alte leider schon weggeschmissen, sorry. Kann deshalb die These, das K&R nicht so ganz der Wahrheit verpflichtet sei, nicht verifizieren.

                Nein; zumindest steht das in meinem K&R anders (Ausgabe von 1990).
                Es gilt ISO, nicht K&R! ;-)

                Der K&R haelt sich eigentlich weitestgehend an den ISO-Standard, AFAIK ;-)

                Kann sein, daß er wirklich zu alt ist.
                BTW: was soll denn eine "weitestgehende" Unterstützung von internationalen Standards? ;-)

                Wo kriegt man den eigentlich her?

                Gibt es leider nur käuflich zu erwerben und ist ziemlich teuer. Sollte aber in Universitäten zur Einsichtnahme ausliegen. Ein dahin gehendes Gesuch könnte also billiger werden.
                Ansonsten gibt es den letzten Draft noch umsonst als Download. Er unterscheidet sich auch nicht wesentlich von der Endfassung.
                Wenn ich nur noch wüßte wo?
                Dateiname müßte IMHO "n869.ps" o.ä. lauten.

                Aber ich stimme den Kollegen hier durchaus zu: es ist ein verdammtes Kreuz
                mit den verschiedenen Architekturen in Verbindung mit C.

                Dann nimm halt Perl ;-)

                Wenn, dann aber richtig: Scheme! ;-)

                so short

                Christoph Zurnieden

                1. Hi,

                  Wo kriegt man den eigentlich her?

                  Gibt es leider nur käuflich zu erwerben und ist ziemlich teuer. Sollte aber in Universitäten zur Einsichtnahme ausliegen. Ein dahin gehendes Gesuch könnte also billiger werden.
                  Ansonsten gibt es den letzten Draft noch umsonst als Download. Er unterscheidet sich auch nicht wesentlich von der Endfassung.
                  Wenn ich nur noch wüßte wo?
                  Dateiname müßte IMHO "n869.ps" o.ä. lauten.

                  http://std.dkuug.dk/JTC1/SC22/WG14/www/docs/.

                  markus

      2. Hallo,

        Das ist IMHO Unfug. Die Grenzen eines int sind ganz klar definiert. Wenigstens
        short, maximal long. Die Compiler-Freiheiten haben naemlich ganz strikte
        Grenzen.

        Aber alleine, daß der verbrauchte Speicherplatz und Wertebereich über Systemgrenzen nicht eindeutig ist, ist IMHO zuviel Unsicherheit. Vor allem das Portieren von Anwendungen wird einem dadurch nicht erleichtert. Es gibt auch genug Probleme, wenn Du beispielsweise nicht nur C-Code für eine Anwendung verwendest und und und. IMHO hätten die Jungs damals sich eindeutig festlegen sollen. Die Argumente, warum das nicht gemacht wurde, sind m.E. nicht gut genug, um all die Nachteile, die dadurch entstehen, wieder zu kompensieren. Diese Entscheidung war vom gleichen Schwachsinn getrieben, der irgendwen zu die dummen zweistelligen Jahreszahlen verleitet hat. Und man hat ja gesehen, wo das hingeführt hat.

        Sei mir nicht böse, aber ich habe schon genug Code von hinnen nach dannen portiert, daß ich weiß wovon ich rede. Irgendwann gewöhnst Du Dir einfach an, dieser unsaubere Geschichte aus dem Weg zu gehen.

        Grüße
          Klaus