Datentyp INT ohne Vorzeichen??

jtm

Level-1
Beiträge
20
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich stehe hier vor folgendem kleinem Verständnisproblem:

Ich lade einen Byte-Wert, schiebe den Wert um 8 nach links, und addiere einen weiteren Byte-Wert dazu. Das Ergebnis transferiere ich in eine Variable vom Typ INT.

Und nun kapiere ich nicht ganz, warum diese Variable den Wert 65222 annehmen kann? Eigentlich sollte hier dann der Wert -314 drinstehen.

Oder habe ich da irgendwas übersehen? Ich war eigentlich der Meinung, dass das MSB beim INT für das Vorzeichen zuständig wäre?

Wenn dieses Verhalten in der Form doch passt: Wie komm ich dann auf den INT-Wert unter Berücksichtigung des Vorzeichens?

Vielen Dank für Eure hilfreichen Tips im Voraus,
Wolfgang
 
Ok, hier mal ein Beispiel (die Konstanten sind im Code natürlich durch Variablen ersetzt):

//Laden des High-Bytes
LD 254
SLD 8
T #TempInt (hier wird dann schon 65024 abgelegt, obwohl TempInt vom Typ INT ist)


//Laden des Low-Bytes
LD 198
LD #TempInt
+I
T #Result (hier stehen dann die genannten 65222 drin)
 
Ich lade einen Byte-Wert, schiebe den Wert um 8 nach links, und addiere einen weiteren Byte-Wert dazu. Das Ergebnis transferiere ich in eine Variable vom Typ INT.

Und nun kapiere ich nicht ganz, warum diese Variable den Wert 65222 annehmen kann? Eigentlich sollte hier dann der Wert -314 drinstehen.
Wo wird Dir denn der Wert 65222 angezeigt? Beim Beobachten des AWL-Programms in der Spalte für Akku1?
Der Akku1 hat 32 Bit. Da Du nur die unteren 16 Bit bearbeitest und die oberen 16 Bit alle auf 0 bleiben (der Akkuwert ist DW#16#0000FEC6), ist diese Anzeige des Akku1-Wertes korrekt (die Akkus kennen strengenommen keine Datentypen. Erst eine Akku-Operation sagt, wie der Akku-Wert interpretiert werden soll).
Erst wenn Du die unteren 16 Bit des Akku1 in eine globale INT-Variable transferierst, dann wird Dir beim Beobachten dieser Variable (als Dezimal in einer Variablentabelle) korrekt -314 angezeigt.

So wie Paule schon schrieb ist das aber nur ein Darstellungsproblem, wie ein Wert angezeigt wird.
Es wird erst wichtig, wenn nachfolgende Operationen den Wert interpretieren (als vorzeichenbehaftet oder nicht).

Harald
 
versuche mal

L Wert
L 65535
UW
T Wert
Was soll das bringen? Damit zwingst Du kein Beobachtungsprogramm dazu, den Wert in der Variable Wert als vorzeichenbehafteten Wert zu interpretieren. Der Wert in der 16-Bit-Variable Wert wird durch diesen überflüssigen Code nicht verändert. (Wäre Wert eine 32-Bit-Variable, würdest Du damit das negative Vorzeichen entfernen.)

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
du arbeitest die ganze Zeit im Doppelwort-Format. Dort ist diese Zahl absolut zulässig. Wie wäre es, das ganze in der Wort-Breite noch einmal zu versuchen ?

//Laden des High-Bytes
L 254
SLW 8
T #TempInt (hier wird dann schon 65024 abgelegt, obwohl TempInt vom Typ INT ist)


//Laden des Low-Bytes
L 198
L #TempInt
+I
T #Result (hier stehen dann die genannten 65222 drin)
welchen Typ hat übrigens Result ?

Gruß
Larry
 

Similar threads

Zurück
Oben