Hallo Fragewurm,
ich mache wahrscheinlich irgendwo ein denkfehler, aber komme
nicht darauf… es geht um folgendes:
- daten werden ja üblicherweise im ascii code auf einem
datenträger gespeichert.
Hier ist schon dein erster Denkfehler.
Die Daten werden auch direkt Binär in unterschiedlichen Formaten gespeichert. Also 1 zu 1 so wie sie im Arbeitsspeicher stehen.
- die zahl 123 würde also aus 3 ascii zeichen bestehen und im
dualsystem folgendermassen aussehen: 00110001 00110010
00110011
Wenn der Programmierer diesen Weg gewählt hat: JA.
- die zahl 55 wären 2 ascii zeichen und würden folgendermassen
codiert: 00110101 00110101
Auch OK
- die ALU ist ja zuständig für die rechenoperationen eines
computers und funktioniert logischerweise im dualsystem. je
breiter die alu (je mehr bits), desto schneller und mächtiger
etc.
JAIN, aber siehe weiter unten.
nun, so weit ist mir noch alles klar, ABER: wenn die ALU die
dezimalzahl 123 mit der dezimalzahl 55 zusammenzählen soll,
verarbeitet sie nun 00110001 00110010 00110011 + 00110101
00110101 oder macht sie ganz einfach direkt 1111011 + 110111
daraus??? -
Es gibt technisch zwei Möglichkeiten das ganze zu Rechnen
-
Binär
Kennst du ja schon
-
BCD
http://de.wikipedia.org/wiki/Binary_Coded_Decimal
Bei der Wandlung von ASCII in BCD müssen nur die oberen 4 Bits auf 0 gesetzt werde. Das geht z.B. mit einer UND-Operation mit der Konstanten 00001111.
Dann Gibt es noch das Packed BCD. Hierbei werden immer zwei BCD Ziffern in 8 Bits gepackt.
Je nach CPU ist die ALU so aufgebaut, dass sie direkt mit BCD rechnen kann oder es gibt Operation, welcher z.B. nach einer binären Addition das Resultat korrigiert.
Die 80x86 verwenden das letztere Verfahren und kennen dazu zusätzliche Befehle:
http://www.i8086.de/asm/8086-88-asm-aaa.html
http://www.i8086.de/asm/8086-88-asm-daa.html
Achja,die meisten FPUs können auch mit BCD rechnen …
ich nehme natürlich letzeres an, aber welcher teil
des computers konvertiert eine 00110001 00110010 00110011 in
1111011 und das gleiche für die 55??
Dazu gibt es keine Hardware, sondern ein Programm.
Hier ein Beispiel in C:
unsigned int binary;
char \*ascii = "123";
unsigned int Ascii2int(char \*s)
{
static unsigned int result = 0;
while (\*s)
{
result \*= 10;
result += \*s & 0x0F;
s++;
}
return result;
}
Aufruf:
binary =Ascii2int(ascii);
MfG Peter(TOO)