Ich habe erwartet, dass dies eine sehr große Zahl und die gleiche Zahl -1 drucken, aber es druckt nur -1 und -2, warum ist das?c Warum wird eine negative Zahl gedruckt?
fprintf(stderr, "%d\n", 0xffffffff);
fprintf(stderr, "%d\n", 0xfffffffe);
Ich habe erwartet, dass dies eine sehr große Zahl und die gleiche Zahl -1 drucken, aber es druckt nur -1 und -2, warum ist das?c Warum wird eine negative Zahl gedruckt?
fprintf(stderr, "%d\n", 0xffffffff);
fprintf(stderr, "%d\n", 0xfffffffe);
%d
Das Format ist eine Ganzzahl mit Vorzeichen (dezimal). Ganzzahlen werden mit two's complement gespeichert, was bedeutet, dass das höherwertige Bit (8000 0000) gewissermaßen das Vorzeichen des Wertes anzeigt.
Zählung nach unten von 3 Werte sind:
0000 0003 = 3
0000 0002 = 2
0000 0001 = 1
0000 0000 = 0
FFFF FFFF = -1
FFFF FFFE = -2
usw.
Wenn Sie FFFF FFFF als große positive Zahl angezeigt werden, verwenden Sie die %u
(unsigned) Format.
Die Werte, die Sie erwähnen, sind die Zweierkomplement-Darstellung von -1 und -2
Suchen two's complement
Das erste Bit auf einer Ganzzahl mit Vorzeichen ist das Zeichen, so dass die höchste Zahl, die ist gespeichert werden könnte 0xEFFFFFFFF.
Das Argument "% d" gibt die Eingabe als eine Ganzzahl mit Vorzeichen aus. Als Ergebnis haben Sie die two's complement representation entdeckt, betrachten Sie stattdessen "% u".
oh, was ist das% für lange? oder unsigniert? – user105033
% u - nur zur Antwort hinzugefügt :) –
int ist% d, unsigned ist% u, long int ist% ld, lang unsigned ist% lu –