Gå til innhold

Anbefalte innlegg

Heisan folkens

Jeg lurer på følgende - i Reflector så ser jeg at TryStringToNumber metoden gjør følgende:

   internal static unsafe bool TryStringToNumber(string str, NumberStyles options, ref NumberBuffer number, StringBuilder sb, NumberFormatInfo numfmt, bool parseDecimal)
   {
       if (str == null)
       {
           return false;
       }
       fixed (char* str2 = ((char*) str))
       {
           char* chPtr = str2;
           char* chPtr2 = chPtr;
           if (!ParseNumber(ref chPtr2, options, ref number, sb, numfmt, parseDecimal) || ((((long) ((chPtr2 - chPtr) / 2)) < str.Length) && !TrailingZeros(str, (int) ((long) ((chPtr2 - chPtr) / 2)))))
           {
               return false;
           }
       }
       return true;
   }

 

Det jeg finner merkelig er dette:

 

(LONG)((chPtr2 - chPtr) / 2) < str.Length

 

<jeg gjør jo noen gjetninger og tenker som så at dette betyr noe slik som:

 

Adressen til chPtr2 minus adressen til chPtr

og så deles dette med 2

 

Spørsmålet er i så fall, hvorfor deles dette på 2? Representeres dataene i minnet med 2 verdier? Er det kansje fordi en CHAR består av 2 bytes? Jeg ville i hvertfall tro det

 

Rart hvordan man plutselig begynner å forstå dette bare ved å skrive et innlegg her på HW ;-)

Lenke til kommentar
Videoannonse
Annonse

Tipper de caster til LONG for å støtte strenger som er større en 4 GB :hmm:

 

Uanset, jeg er veldig usikker på hvorfor en peker til en peker skal gi siste verdi i tallet. jeg klarer liksom ikke helt å se hvorfor dette er en selvfølge

 

AHHH!!! Plutselig skjønte jeg hvorfor!

 

Det første elementet i char pekeren er sikkert lengden til strengen og da går regnestykket opp..

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...