Konvertiert hexadezimal-Zeichenfolge zu lang

Ich versuche zu tun, eine hexadezimal-zu-Ganzzahl-Konvertierung einer 32 bit Maschine. Hier ist der code, den ich Teste mit,

int main(int argc,char **argv)
{
    char *hexstring = "0xffff1234";
    long int n;

    fprintf(stdout, "Conversion results of string: %s\n", hexstring);
    n = strtol(hexstring, (char**)0, 0); /* same as base = 16 */
    fprintf(stdout, "strtol = %ld\n", n);
    n = sscanf(hexstring, "%x", &n);
    fprintf(stdout, "sscanf = %ld\n", n);
    n = atol(hexstring);
    fprintf(stdout, "atol = %ld\n", n);
    fgetc(stdin);

    return 0;
  }

Dies ist, was ich bekomme:

 strtol = 2147483647 /* = 0x7fffffff -> overflow!! */
 sscanf = 1 /* nevermind */
 atol = 0   /* nevermind */

Wie Sie sehen, mit strtol bekomme ich einen überlauf (ich habe auch überprüft mit errno), obwohl ich würde erwarten, dass keine passieren, da 0xffff1234 ein Gültiger integer 32bit-Wert.
Ich würde entweder erwarten, dass 4294906420 oder sonst -60876

Was bin ich?

  • Sind Sie sicher, dass Sie die base-Nummer auf 0, ist der 16. Ich meine ersetzen strtol(hexstring, (char*)0, 0)* durch strtol(hexstring, (char*)0, 16)*
  • Einstellung der Basis 0, bedeutet strtol versucht, es herauszufinden, selbst vom Anfang der Eingabezeichenfolge, ob mit Basis 16, 10 oder 8.
  • richtig, ich vergaß es ! Danke !
InformationsquelleAutor jpmuc | 2012-07-24
Schreibe einen Kommentar