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.


  • Mod

    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.


  • Mod

    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.


  • Mod

    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 😮


Log in to reply