casting
-
hi,
warum haben die in diesem code einen (unsigned long) cast für us_max? us_max ist ja ein integer! ist da ein fehler?
lg
int UserStackWatch(void) { extern unsigned int USTop; // Refer to _USTop in CSTARTX.ASM extern unsigned int USBot; // Refer to _USBot in CSTARTX.ASM far unsigned int * ustop = (far unsigned int *)&USTop; far unsigned int * usbot = (far unsigned int *)&USBot; far unsigned int * p; int us_max; for (p = usbot; p < ustop; p++ ) // Check how much stack space { // with signature 0x167 is left if (*p != 0x167) break; } // Express stack usage in % us_max = (unsigned long) 100 * (ustop - p)/(ustop - usbot); return us_max; }
-
in unsigned passen größere Zahlen, weil das Vorzeichenbit als weitere **2
genommen werden kann
-
Egentlich wird nur die 100 zu unsigned long.
Das wird gemacht weil 100 * (ustop - p) durchaus größer als der Wertebereich von int sein kann. Durch das teilen durch (ustop - usbot) passt das dann wieder in int.
-
Was wäre, wenn 100 * (ustop - p) größer als der maximale Integerwert wäre?
Der Cast ist aber dennoch unnötig, da natürlich die 100 direkt als unsigned long angegeben werden könnte, indem man 100UL schreibt.
#include<stdio.h> #include<limits.h> int main(void) { int ustop=INT_MAX; int us_max_cast = (unsigned long) 100 * ustop/ustop; int us_max_literal = 100UL * ustop/ustop; int us_max = 100 * ustop/ustop; printf("%d\n%d\n%d\n", us_max, us_max_literal, us_max_cast); return 0; }
edit: Oh, zu langsam.
-
warum ist hier us_max = -1??
unsigned int counter = 0; unsigned int us_max = (unsigned long)(1024.0/counter);
-
1. Woher weißt du das us_max == -1 ist?
2. Durch Null Teilen ist verboten.
-
cguru schrieb:
warum ist hier us_max = -1??
1024.0 / 0 = inf (zumindest wenn dein Fließkommatyp dies unterstützt, was in 99.9999% der Fälle so ist)
(unsigned long) inf = undefiniert. Bei mir (GCC 4.4 auf 64 Bit) kommt zum Beispiel 0 heraus.
-
DirkB schrieb:
2. Durch Null Teilen ist verboten.
Wieso? Kommt dann die Polizei?
-
SeppJ schrieb:
DirkB schrieb:
2. Durch Null Teilen ist verboten.
Wieso? Kommt dann die Polizei?
Nein, dann stürzt irgendein Prozessor ab, man kann das aber abwenden indem man binär bis 10 zählt.
@cguru
(unsigned long) inf = kann aber auch ULONG_MAX sein. und
printf("%ld", ULONG_MAX); ergibt -1
-
DirkB schrieb:
Nein, dann stürzt irgendein Prozessor ab
Ich befürchte das dies nicht passiert. Das wäre dann ja der Übervirus, der jeden Prozessor abstürzen lassen könnte