int ptr auf long
-
Hallo,
Ich habe folgende Frage:
wenn ich einen int pointer auf einen long variable
habe und den pointer dereferenziere, kriege ich
den long Wert anstatt einen int Wert. Bespiel:int main(int argc, char** argv){ long lval = 20000000 ; /* long genug um Unterschied zu zeigen */ int *test = &lval ; /* ptr auf long value */ fprintf(stdout, "long value ist:%ld und der derefenzierter int ptr Wert:%d\n", lval, *test); return EXIT_SUCCESS; }
kriege ich dann:
long value ist:20000000 und der derefenzierter int ptr Wert:20000000
Wieso kriege ich den gleichen Wert obwohl ich durch den int ptr Derefernzierung(*test),
ihn auf int gecastet habe(Oder so denke ich mir)?
-
Wenn du dir mal mit sizeof die Größe von long und int anschaust,
wird dir auffallen -- zumindest bei mir --, dass beide die gleiche
Größe habe, also beide den gleichen Zahlenbereich abdecken.Bei mir: (32bit Linux) 4byte (32bits)
Also geht der Zahlenbereich von -2^31 ... 2^31-1.
Deine 20000000 liegt in diesem Zahlenbereich.
Gruß mcr
#include <stdio.h> #include <stdlib.h> #include <limits.h> int main(void){ printf("sizeof: long: %d\n", sizeof(long)); printf("sizeof: int: %d\n", sizeof(int)); printf("min: %d\n", INT_MIN); printf("max: %d\n", INT_MAX); return 0; }
-
Das kann mehrere Gründe haben, der wahrscheinlichste ist, dass auf in deiner Umgebung
sizeof(long) = sizeof(int)
.edit: und wieder zu langsam...
-
Tim schrieb:
Das kann mehrere Gründe haben, der wahrscheinlichste ist, dass auf in deiner Umgebung
sizeof(long) = sizeof(int)
.Ok, danke für die Antworten. Jetzt wo ich die Grenzen und byte Länge
wieder nachgeschaut habe, hat`s geklappt.Gibt's einen Header wodurch mein Programm direkt die Byte-Länge jedes Data-Typs
feststellen kann? Wie macht man das mit einer Makro anstatt sizeof()? (Egal
welche Art von *X)
-
Moment mal sizeof ist ein eingebautes Schlüsselwort das dir die Größe eines beliebigen Ausdrucks in Bytes zurückgibt.
Im Ansi C Standard ist noch nicht einmal die Anzahl der Bits pro Byte festgelegt, da man solche Dinge, aber oft braucht gibt es diverse Makros in limits.h, z.B. CHAR_BIT was die Anzahl der Bits in einer char Variable angibt (welche als fixe Größe 1Byte hat), dann kannst du die Anzahl der Bits in einem Typ mit sizeof( typ ) * CHAR_BIT berechnen.
Ob signed oder unsigned wird dadurch allerdings nicht abgedeckt.
-
S.T.A.L.K.E.R. schrieb:
Moment mal sizeof ist ein eingebautes Schlüsselwort das dir die Größe eines beliebigen Ausdrucks in Bytes zurückgibt.
so ist es, dabei hat sizeof() das Problem dass es nicht vom Preprocessor expandiert
wird, bevor Quellcode kompiliert wird. Ich brauche deswegen etwas wie:#ifdef LONG_IS_EIGHT_BYTES_HERE /* ohne sizeof(), gibt's irgendwo in system headers?*/ #define MY_LONG_BYTE_LENGTH 8 #endif
-
ptrp_ng schrieb:
S.T.A.L.K.E.R. schrieb:
Moment mal sizeof ist ein eingebautes Schlüsselwort das dir die Größe eines beliebigen Ausdrucks in Bytes zurückgibt.
so ist es, dabei hat sizeof() das Problem dass es nicht vom Preprocessor expandiert
wird, bevor Quellcode kompiliert wird. Ich brauche deswegen etwas wie:#ifdef LONG_IS_EIGHT_BYTES_HERE /* ohne sizeof(), gibt's irgendwo in system headers?*/ #define MY_LONG_BYTE_LENGTH 8 #endif
Schau dir mal Autoconf an, das ist dafür gemacht um solche Informationen zu ermitteln und dir in deinen Programmen zur Verfügung zu stellen. Mit Boardmitteln geht es leider nicht.
-
ptrp_ng schrieb:
so ist es, dabei hat sizeof() das Problem dass es nicht vom Preprocessor expandiert
wird, bevor Quellcode kompiliert wird. Ich brauche deswegen etwas wie:Warum brauchst du das? Warum reicht es dir nicht wenn es zur Compilezeit evaluiert wird?
-
Tim schrieb:
Warum brauchst du das? Warum reicht es dir nicht wenn es zur Compilezeit evaluiert wird?
Weil ich die maschinenabhängige Bytelänge der Datentypen zu meiner unabhängigen
Datentypen projezieren möchte. Etwa so:#ifdef INT_IS_TWO_BYTES_HERE #define PROG_SHORT_IS_MINT 1 #endif #ifdef INT_IS_FOUR_BYTES_HERE #define PROG_INT_IS_MINT 1 #endif /* weiter unten */ #ifdef PRG_SHORT_IS_MINT validate_number(..., ..., PRG_SHORT); #elif PRG_INT_IS_MINT validate_number(..., ..., PRG_INT); #else ... ; #endif
Gruss