WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   Grundlegende C Frage ! (http://www.wcm.at/forum/showthread.php?t=76788)

Who-T 24.11.2002 15:58

genauso im prinzip

register a = (0xFF00 & 16bit register) >> 8;
register b = 0xFF & 16bit register;

kikakater 26.11.2002 10:38

Zitat:

Original geschrieben von Who-T
genauso im prinzip

register a = (0xFF00 & 16bit register) >> 8;
register b = 0xFF & 16bit register;

Das "(0xFF00 & 16bit register)" kann man sich zugunsten eines einfachen "16bit register" ersparen, weil durch das ">> 8" die unteren 8 Bits sowieso nach rechts (in den Orkus) geschoben werden - sprich außerhalb des Bitbereichs mit dem Endbit 0, links steht das Bit 15, rechts das Bit 0.

register a = 16bit register >> 8;

Da nicht rotiert wird - sondern geshiftet - fällt alles von den unteren 8 Bits weg und die oberen 8 Bits werden durch das Verschieben um 8 Stellen nach rechts zu den unteren 8 Bits, tja so einfach geht es.

mfg Kikakater

Flink 26.11.2002 12:45

@kikakater:
Zitat:

Da nicht rotiert wird - sondern geshiftet - fällt alles von den unteren 8 Bits weg und die oberen 8 Bits werden durch das Verschieben um 8 Stellen nach rechts zu den unteren 8 Bits
Das ist nur dann der Fall, wenn die C-Variablen als unsigned int deklariert worden sind! Wenn man nicht explizit unsigned angibt, verwenden die meisten Compiler standardmäßig signed int! In diesem Fall wird jedoch das Vorzeichen beibehalten, was bedeutet: Wenn an Bitposition 15 eine 1 gestanden ist, dann werden 1er beim Shift-Befehl jeweils an Bitposition 15 gesetzt. Dies deshalb, weil eine 1 vorne als negative Zahl interpretiert wird, die beim Shift erhalten bleiben soll.
Um auf Nummer sicher zu gehen und sich nicht um signed/unsigned kümmern zu müssen:
register a = (16bit register >> 8 ) & 0xFF;

kikakater 26.11.2002 13:07

Du widersprichst Dir selbst. Ein Register ist standardmäßig unsigned.

int Variablen sind je nach Compilerimplemenation short (16bit) bzw. long (32bit). Außderdem nehmen die meisten Compiler einen int (Datentyp) als signed int an.

Wenn ich nun einen hohen 16bit Wert (Highbyte), der negativ ist, um 8 Bits nach rechts shifte, ist die einzige richtige Lösung, die Variable mit (unsigned int) umzutypisieren/=zu casten.

Clystron 26.11.2002 14:35

Zitat:

Original geschrieben von kikakater
int Variablen sind je nach Compilerimplemenation short (16bit) bzw. long (32bit). Außderdem nehmen die meisten Compiler einen int (Datentyp) als signed int an.

Wenn ich nun einen hohen 16bit Wert (Highbyte), der negativ ist, um 8 Bits nach rechts shifte, ist die einzige richtige Lösung, die Variable mit (unsigned int) umzutypisieren/=zu casten.

Also wenn ihr hier schon Haare spaltet:

Signed oder Unsigned ist reine Interpretationssache, der Inhalt der Speicherstelle schaut immer gleich aus.

Ein Int ist immer so breit wie ein Register des Prozessors auf den compiliert wird, mindestens aber 16Bit. Auf einem 8Bitter also 16Bit, auf einem 16Bitter 16Bit, auf einem 32Bitter 32Bit und auf einem 64Bitter 64Bit. Das macht die Ints ja so "interessant"...

<OT>
Was machst du aber wenns wie bei Java keine unsigned-type gibt?
</OT>

mfG
Clystron

kikakater 26.11.2002 18:08

Halleluja rufen, denn unsigend ints sind eine Geschmackverirrung in Zeiten von 64bit.

unsigned ints sind grundsätzlich abzulehnen ...

Bei verschiedenen engen Nummernkreisen machen sie einen Sinn, sonst sind sie jedoch eine Quelle für viele Programmfehler.

Flink 27.11.2002 09:26

Zitat:

Original geschrieben von kikakater
Ein Register ist standardmäßig unsigned.
Das mag vielleicht bei deinem Compiler so liegen. Bei vielen Compilern kommt es auf die Einstellungen in der Konfiguartionsdatei an, was 'register' und 'int' nun bewirken! Dies hat aber sehr große Auswirkungen darauf, was eine Operation mit SHIFT-RIGHT bewirkt!

kikakater 27.11.2002 09:29

Deswegen habe ich auch gemeint, daß man vor dem Verschieben einen Cast durchführen muß um portabel zu sein, respektive damit der Code portabel ist.


Alle Zeitangaben in WEZ +2. Es ist jetzt 03:13 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag