[Novize] Integer Constants ?!



  • Hey Leute ich lese mich derweil neu in C ein und habe mal ne Frage zum momentanen Thema hier.

    Hier wird etwas für Integer Constanten erzählt - jedoch verstehe ich nicht genau wo der Unterschied zu den üblichen Variablen ist.
    Er definiert hier eine 2 Byte Variable mit "long". Im weiteren Verlauf redet er von einer constant variable in 2 Byte welche aber ein capital "L" angehängt bekommet. Inwiefern ist dies denn eine Konstante nun. Ich kenne bisher nur globale Konstanten aka "#define Menge 5". Diese Konstante wie hier beschrieben könnte ich doch ohne Probleme mit einer artihmetischen Expression verändern lassen bzw. den Wert in einem neuen Statement einfach ändern. Der Sinn einer Konstanten ist doch den Wert permanent beizubehalten.

    Bitte um Aufklärung 🙂

    Specifying Integer Constants
    Because you can have different kinds of integer variables, you might expect to have different kinds
    of integer constants, and you do. If you just write the integer value 100 for example, this will be of
    type int. If you want to make sure it is type long, you must append an uppercase or lowercase letter L
    to the numeric value. So the integer 100 as a long value is written as 100L. Although it’s perfectly legal,
    a lowercase letter l is best avoided because it’s easily confused with the digit 1.
    To declare and initialize the variable Big_Number, you could write this:

    long Big_Number = 1287600L;

    An integer constant will also be type long by default if it’s outside the range of type int. Thus, if
    your compiler implementation uses 2 bytes to store type int values, the values 1000000 and 33000
    will be of type long by default, because they won’t fit into 2 bytes.
    You write negative integer constants with a minus sign, for example:

    int decrease = -4;
    long below_sea_level = -100000L;

    Quelle: Beginning C from Novize to Professional



  • Wenn ich das richtig verstehe, verwechselst du hier die Konstanten (in diesem Fall konstante Zahlenwerte, wie 1287600L, mit den Variablen, wie long Big_Number, denen diese Werte zugeordnet werden.

    Du kannst long Big_Number einen neuen Wert zuweisen, aber nicht 1287600L.



  • Es geht darum das Ganzzahlenwerte die im Quelltext auftauchen als int aufgefasst werden, wenn sie im Wertebereich eine int liegen.

    Wenn du auf einem System bist, dessen int 2 Byte belegt, dann kann es zum Überlauf kommen, wenn du z.B long l = 20000 + 20000; schreibst, da die Zahlen als int aufgefasst werden und die Berechnung auch auf Basis von int erfolgt.

    Wenn du dagegen long l = 20000L + 20000L; schreibst, sind die Zahlen long und dann die Berechnung auch.



  • DirkB schrieb:

    Es geht darum das Ganzzahlenwerte die im Quelltext auftauchen als int aufgefasst werden, wenn sie im Wertebereich eine int liegen.

    Wenn du auf einem System bist, dessen int 2 Byte belegt, dann kann es zum Überlauf kommen, wenn du z.B long l = 20000 + 20000; schreibst, da die Zahlen als int aufgefasst werden und die Berechnung auch auf Basis von int erfolgt.

    Wenn du dagegen long l = 20000L + 20000L; schreibst, sind die Zahlen long und dann die Berechnung auch.

    Hm verstehe ich noch nicht ganz...

    long l = 20000 + 20000 ||

    dies würde 40000 ergeben... 2 Bytes reichen dort also nicht aus da das maximum bei +32.767 liegt?

    Wenn ich hier richtig liege...in wiefern ändert dann 20000L + 20000L das Ganze...?

    bekommt dann jeder Operator 2 Byte sodass am Ende 4 Bytes genutzt werden? Das Ergebnis also bis +2,147,438,647 betragen kann?



  • Integer Konstanten sind einfach ein Folge von Ziffern mit optionalem Vorzeichen und optionalem Typ-Suffix. Sie haben Typ und Wert, belegen aber keinen Speicher.

    Variablen kann man etwas zuweisen, d.h. prinzipiell ihren Wert verändern, bei Integer Konstanten, auch Literale genannt, nicht.

    int i = 0; /* i ist eine Variable, 0 ist ein Integer Literal */
    
    i = 123;
    Schon mal versucht, das für eine Integer-Konstante zu machen?
    0 = 123;
    

    Was meinst du, was würde das ergeben?

    An integer constant will also be type long by default if it’s outside the range of type int.

    Ist auch falsch, zumindest für C89. Dort gilt int -> unsigned int -> long int, in C99 dann int -> long int -> long long int.



  • Wutz schrieb:

    Ist auch falsch, zumindest für C89. Dort gilt int -> unsigned int -> long int, in C99 dann int -> long int -> long long int.

    Falsch. C89: int -> long int -> unsigned long int (für dezimal)



  • Geht es also in dem Thema Integer Konstanten um den Ganzzahlenwert auf der rechten Seite der Action "=" ?

    Es geht also darum das die in einer Variablen festgelegten Zahl eine Konstante ist. Was ja irgendwo auch logisch ist. Habe halt gedacht es geht irgendwie um die Variable. Hoffe habe das irgendwie verstanden nun. Ich weiss schon welchen Sinn "in" "long" "unsigned" etc. haben. Jedoch wusste ich nicht genau was Integer Constants bedeuten sollen bzw. um "Wen" es in dem Thema ging.


Anmelden zum Antworten