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 !
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie nicht möchten, dass der overflow-Effekt, verwenden Sie nicht die signierte Variante der Funktion. Verwenden
strtoul()
statt.Mit dem folgenden code:
Bekomme ich:
Können Sie nicht Steuern, das beim Aufruf
strtol()
und seine Brüder, da ist das Verhalten innerhalb diese Funktionen. Die standard hat dies zu sagen:Den minimalen Bereich der
long
ist -2147483647 bis 2147483647. Die Palette derlong
auf Ihre Umsetzung dürfte -2147483648 bis 2147483647.Die definition der
strtol()
sagt, dass, wenn der konvertierte Wert ist außerhalb des Bereichs vonlong
,LONG_MIN
oderLONG_MAX
zurückgegeben wird, nach den Zeichen der konvertierte Wert, undERANGE
gespeichert inerrno
. In diesem Fall wird der umgewandelte Wert0xffff1234
ist außerhalb des Bereichs - es ist größer alsLONG_MAX
, soLONG_MAX
zurückgegeben.Durch die Art und Weise, Ihren Anruf zu
sscanf()
überschreiben Sie die konvertierte Wert inn
mit der return-Wert vonsscanf()
1 zeigt, dass es eine 1 die erfolgreiche Umsetzung.