WCM - Das österreichische Computer Magazin Forenübersicht
 

Zurück   WCM Forum > Rat & Tat > Programmierung

Programmierung Rat & Tat für Programmierer

Microsoft KARRIERECAMPUS

Antwort
 
Themen-Optionen Ansicht
Alt 24.11.2002, 15:58   #11
Who-T
Elite
 
Registriert seit: 01.08.2000
Beiträge: 1.395


Who-T eine Nachricht über ICQ schicken
Standard

genauso im prinzip

register a = (0xFF00 & 16bit register) >> 8;
register b = 0xFF & 16bit register;
____________________________________
Whoever built humanity left in a major design flaw: it was the tendency to bend at the knees.
Who-T ist offline   Mit Zitat antworten
Alt 26.11.2002, 10:38   #12
kikakater
Inventar
 
Registriert seit: 24.01.2001
Beiträge: 5.631


Standard

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
kikakater ist offline   Mit Zitat antworten
Alt 26.11.2002, 12:45   #13
Flink
Hero
 
Registriert seit: 29.08.2001
Alter: 57
Beiträge: 904


Flink eine Nachricht über ICQ schicken Flink eine Nachricht über Skype™ schicken
Standard

@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;
____________________________________
Bibel
Flink ist offline   Mit Zitat antworten
Alt 26.11.2002, 13:07   #14
kikakater
Inventar
 
Registriert seit: 24.01.2001
Beiträge: 5.631


Standard

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.
kikakater ist offline   Mit Zitat antworten
Alt 26.11.2002, 14:35   #15
Clystron
Hero
 
Registriert seit: 07.02.2001
Alter: 46
Beiträge: 805


Clystron eine Nachricht über ICQ schicken
Standard

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
____________________________________
God, Root, what is difference?
Clystron ist offline   Mit Zitat antworten
Alt 26.11.2002, 18:08   #16
kikakater
Inventar
 
Registriert seit: 24.01.2001
Beiträge: 5.631


Standard

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.
kikakater ist offline   Mit Zitat antworten
Alt 27.11.2002, 09:26   #17
Flink
Hero
 
Registriert seit: 29.08.2001
Alter: 57
Beiträge: 904


Flink eine Nachricht über ICQ schicken Flink eine Nachricht über Skype™ schicken
Ausrufezeichen

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!
____________________________________
Bibel
Flink ist offline   Mit Zitat antworten
Alt 27.11.2002, 09:29   #18
kikakater
Inventar
 
Registriert seit: 24.01.2001
Beiträge: 5.631


Standard

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.
kikakater ist offline   Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 02:06 Uhr.


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