
|
INFO - FAQ - CC2-Forum - CCPro-Forum |
|
Hallo, > 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. Eben. Bei Fließkommazahlen wird eigentlich das Zweierkomplement verwendet. Eine Ausnahme bildet der Exponent, das hat aber andere Gründe. > 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). Hast Du gelesen was ich geschrieben habe? Es gibt keine Reservierung des MSB. Sonst würde ein logischer Shift gar nicht mit 16 Bit laufen (bei 16 Bit Worten). Mir ist durchaus bekannt, dass beim arithmetischen Shift das MSB ins Carry geschoben wird und anschließend wieder gesetzt wird. Im übrigen war das gar nicht worauf ich hinauswollte. Du sagtest die M Unit würde einen falschen Right Shift machen mit 15 Bit Shift. Genau das ist falsch. > 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 (...) Ja in der Hilfe steht, dass es arithmetische Shifts sind. Da scheint die M Unit 2 offenbar einen anderen Weg zu gehen. Das ist zugegeben sehr gewöhnungsbedürftig. Dennoch ist der Shift, anders als Du darstellen wolltest, ganz regulär, wenn auch logisch und nicht arithmetisch. Im übrigen halte ich logische Shifts für sinnvoller bei 16 Bit Integerzahlen, so kann man das Vorzeichenbit einfacher verarbeiten. In diesem Falle wäre natürlich auch die Option eines arithmetischer Shifts sinnvoll, so könnte man schnelle Divisionen und Multiplikationen mit einer Zweierpotenz realisieren. > Doch, siehe Flags. Die kann man mit der C-Control nicht abfragen. Ferner bedeutet ein gesetztes Flag nicht zwangsläufig, dass die CPU nun anders die Daten behandelt. Die Flags können zum Beispiel vom Benutzer ausgelesen werden um bedingte Sprünge zu machen (Gleichheit, Größer, Kleiner, ...) > > > 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. Ja wo ist der Fehler? Man beginnt mit der Zähler ab 0. Bit 7 (also das oberste Bit) wird mit 0 belegt, genauso wie bei dem SHR der M Unit 2.0. Das unterste Bit wandert in das Carry, kann aber aus Basic heraus nicht gelesen werden. Das ist genauso wie ich das beschrieben habe. > > 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. > Wie ich beschrieben habe ist die Zahl positiv. > 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. ;-) Falsch, da die M Unit einen korrekten Logischen Shift durchzieht. Prüfe es mit einem binären Rechner. > 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. In der Referenz von BASIC++ steht diplomatischerweise weder logischer noch arithmetischer Shift. Gruß, Stefan Meine Homepage: http://www.fdos.de/ccbpp |
| Antwort schreiben |