Für einen Teil einer größeren Aufgabe, ich schreibe ein Programm, das eine Binärzahl in eine Dezimalzahl konvertiert. Ich weiß, dass die Art und Weise, wie ich es mache, irgendwie komisch ist und wahrscheinlich verbessert werden könnte, aber ich mag es so, wie es jetzt ist, und es funktioniert fast. Das einzige Problem ist, dass wenn Sie es 10 als Ihre Binärzahl füttern, es 1 zurückgibt, aber es sollte 2 zurückgeben. Alle anderen Zahlen, die ich getestet habe, funktionieren ordnungsgemäß. Hier ist der relevante Teil des Codes:Warum gibt mein C-Binär-zu-Dezimal-Programm den richtigen Wert nicht zurück?
int countDigits (int num) {
int digits = 0;
while (num != 0) {
num /=10;
digits++;
}
return digits;
}
long int binToDec (int num) {
int numDigits = countDigits(num);
char temp[32];
int numStore[32];
long int sum = 0;
snprintf(temp, 32, "%d", num);
for (int i = 0; i < numDigits; i++) {
numStore[i] = temp[i] - '0';
}
for (int i = 0; i < numDigits; i++) {
if (numStore[i] == 1) {
sum += pow(2, i);
}
}
printf("%ld\n", sum);
return sum;
}
int main(void) {
binToDec(10);
return 0;
}
Ich kann absolut nicht herausfinden, warum es nicht den richtigen Wert zurück. Zuerst dachte ich, ich würde in der falschen Reihenfolge iterieren, aber wenn ich es nicht falsch ausführte, führte das Zählen von i nach unten anstatt nach oben zu der gleichen Ausgabe. Könnte jemand auf meinen Fehler hinweisen?
Haben Sie versucht, den Debugger zu verwenden, um durch das Programm zu gehen, so dass Sie Variablen bei jedem Schritt untersuchen können? – Barmar
Weil Sie '2^i' verwendet haben, wo Sie' 2^(numDigits-1-i) 'seit Sie gehen in umgekehrter Reihenfolge verwendet haben sollten. – Nelfeal
"Ich kenne die Art, wie ich es mache, ist irgendwie komisch" - was für eine Untertreibung. Sie interpretieren die dezimale Darstellung einer Zahl als binäre Darstellung einer anderen Zahl, die * bizarr * ist. Für die Mehrzahl der möglichen Argumentwerte ist dies nicht einmal sinnvoll. –