_atoi64 selbst geschrieben

21/09/2010 - 22:26 von Franz Bachler | Report spam
Hallo Leute,

mich hat genervt, dass die __int64 Variablen bei jedem Compiler (Borland,
MinGW, Visual Studio und auch gcc unter Linux) andere Befehle zur
Konvertierung haben und daher selbst in die "Trickkiste" gegriffen:

#ifdef __GNUC__
#ifdef __unix__
#define __int64 long long int
#endif
#ifndef MAXINT64
#define MAXINT64 9223372036854775807LL // 2 hoch 63 - 1
#endif
#else
#ifndef MAXINT64
#define MAXINT64 9223372036854775807 // 2 hoch 63 - 1
#endif
#endif

__int64 myatoi64(char *s)

{
char *sp=s, neg=0;
unsigned __int64 iZahl=0;

// führende Leerstellen überspringen
while (*sp==' ') sp++;

// Vorzeichen überprüfen
switch (*sp)
{
case '-': neg=1; // kein break hier
case '+': sp++;
}

// wir wollen keine führenden Nullen! :-)
while (*sp=='0') sp++;

while(*sp)
{
if (*sp<'0' || *sp>'9') break;
iZahl = iZahl*10 + ((int) *sp++ - '0');
if (iZahl > MAXINT64+neg) return(0);
}
return (neg ? -iZahl : iZahl);
}

Die Trickserei mit unsigned __int64 ist notwendig, weil sonst die
Zahl -9223372036854775808 nicht mehr konvertiert werden kann und
bei -9223372036854775807 Schluß wàre.

Grüsse
Franz

Franz Bachler, A-3250 Wieselburg
E-Mail: fraba (at) gmx.at
Homepage: http://members.aon.at/fraba
oder http://home.pages.at/fraba
 

Lesen sie die antworten

#1 Claus Reibenstein
21/09/2010 - 23:46 | Warnen spam
Franz Bachler schrieb:

mich hat genervt, dass die __int64 Variablen bei jedem Compiler (Borland,
MinGW, Visual Studio und auch gcc unter Linux) andere Befehle zur
Konvertierung haben und daher selbst in die "Trickkiste" gegriffen:



Namen, die mit "__" beginnen, sind reserviert. Von daher kannst Du die
Existenz dieser Namen nicht einmal voraussetzen, geschweige denn
identische Bedeutung oder Verhaltensweisen erwarten.

Des Weiteren geht es hier in dieser Gruppe um ANSI/ISO-C und dessen
Vorlàufer, nicht jedoch um konkrete Implementierungen. Diskussionen
dieser Art sind in den Programmiergruppen besser aufgehoben.

Für Integers mit exakt 64 Bit sieht der Standard übrigens die Datentypen
int64_t und uint64_t, für mindestens 64 Bit die Typen int_least64_t und
uint_least64_t vor. Die letzten beiden muss jede standardkonforme
Implementierung unterstützen, wàhrend die ersten beiden optional sind.

Die Trickserei mit unsigned __int64 ist notwendig, weil [...]



Die "Trickserei" ist überflüssig, wenn Du die oben genannten
Standard-Typen verwendest.

Gruß. Claus

Ähnliche fragen