
|
INFO - FAQ - CC2-Forum - CCPro-Forum |
|
Hallo Stefan. > ...kann man nur durch die Bildung des Zweierkomplements eine negative Zahl darstellen Nicht unbedingt. Das Vorzeichen einer negativen Zahl kann man auch in einem richtigen Vorzeichenbit speichern. So wird das zum Beispiel bei Fließkommazahlen üblicherweise gelöst. Aber bei "signed Integer" wird natürlich das Zweierkomplement verwendet. > ...das Vorzeichenbit ist nicht reserviert und wird bei allen mir bekannten Rechner-Architekturen (x86 etc.) durch einen Shift ebenfalls beeinflusst. ... Wenn dann das Vorzeichenbit zusätzlich noch gesetzt wird ist das eine Eigenart der CC1, keinesfalls aber Standard. Auch das ist nicht richtig. Es gibt immer die Unterscheidung zwischen arithmetischem und logischem Shift: In 8086-Assembler gibt es die Befehle SAL (Shift Arithmetic Left), SAR (Shift Arithmetic Right), SHL (Shift Logical Left) und SHR (Shift Logical Right). In 6805-Mnemonic heißen diese Befehle genauso wie bei der 68000er-CPU ASL, ASR, LSL und LSR. Nebenbei ist es ganz interessant, daß es zwar eine Unterscheidung in der Mnemonic zwischen logischem und arithmetischem Linksschieben gibt, aber da beides auf's gleiche hinausläuft natürlich die gleichen Opcodes erzeugt werden. Auch wenn in CCBASIC die Befehle zum Shiften genauso wie in 8086-Assembler SHL und SHR heißen, handelt es sich um arithmetische Shiftbefehle. Das ist auch sinnvoll, da 16-Bit-Integerzahlen auf der C-Control, wie Du schon schreibst, im Zweierkomplement verarbeitet werden. Logische Shiftbefehle machen bei negativen Zahlen nicht viel Sinn. > Die CPU weiß ja nicht, dass es eine negative Zahl ist... Doch, siehe Flags. > Der logische Shift ist der, den die M Unit 2 macht... Und auch das ist nicht richtig. Hier die Definition eines logischen 8-Bit-Rechtsshifts: Shifts all bits of ACCA, X, or M one place to the right. Bit 7 is loaded with a zero. Bit 0 is shifted into the Carry bit. Würde die V2 einen logischen Shift machen, müßten alle unveränderten 16 Bits geshiftet und das MSB auf 0 gesetzt werden. Die Zahl würde dabei positiv. Ein (-32322) shr 4 wäre vollkommen gleichbedeutend mit dem Verschieben von 33214 um 4 binäre Stellen nach rechts und würde 2075 ergeben. So wie ich das sehe, entfernt die V2 vor dem Shiften ein eventuell vorhandenes Vorzeichen durch Negation. Es wird also ABS(z) SHR 4 durchgeführt. Obwohl das keinen Sinn ergibt, ist es natürlich gut möglich, daß das gar kein Bug ist, sondern Absicht vom Entwickler. ;-) > SHR ist aber die Standardvariante. Die Buchstabenfolge SHR steht für SHift Right. Hier ist also noch gar keine Aussage darüber getroffen, ob es sich um ein logisches oder arithmetisches Schieben handelt. Die V1.1 arbeitet im Gegensatz zur V2 vollkommen korrekt. Exakt so, wie in der Onlinehilfe von CCBASIC (und hoffentlich auch Basic++) beschrieben. Dietmar Meine Homepage: http://ccintern.dharlos.de |
| Antwort schreiben |