int8 Vorzeichenproblem

E.Faber
 
Avatar
 
Subject:

int8 Vorzeichenproblem

 · 
Posted: 30.07.2010 - 14:12  ·  #1
Hallo,

ich versuche gerade einem DS18S20 Werte unter 0°C abzuringen und
es klappt es einfach nicht...

Folgendes habe ich versucht (FTemp ist vom Typ Int8, TMsb und TLsb vom Typ Byte) :
...
if TMsb = $00 then
TLsb := TLsb shr 1;
FTemp := Int8(TLsb);

Else

TLsb := (not TLsb)+1; // Two's Complement
TLsb := TLsb shr 1; // Ganzzahlig
FTemp := Int8(TLsb); // so damit neg. Zahlen mögl. sind

bis hierher stimmen die Werte... es kommt Bei meinem Testbeispiel 25 heraus...

Incl(FTemp, 7); //

und hier bekomme ich keine -25 sondern -103..


EndIf;
...

Gebe ich FTemp := -25; ein bekomme ich auch auf dem Display
auch -25 angezeigt, wenn ich hingegen folgendes probiere:

FTemp := 0;
Incl(FTemp, 7);

bekomme ich -128 heraus, was ja ausserhalb des int8 Wertebereichs liegt.

Mache ich hier einen kompletten Denkfehler???

Grüße

Elmar
Gunter
Administrator
Avatar
Gender:
Location: Frankfurt Main / Germany
Posts: 1697
Registered: 02 / 2003
Subject:

Re: int8 Vorzeichenproblem

 · 
Posted: 30.07.2010 - 15:38  ·  #2
Hi Elmar,

natürlich ist -128 im INT8 Bereich!
Es gibt immer einen negativen Wert mehr als einen positiven:
128 negative + 127 positive + die Null ==> 256 mögliche Bitmuster!

Quote
bis hierher stimmen die Werte... es kommt Bei meinem Testbeispiel 25 heraus...
Incl(FTemp, 7); //
und hier bekomme ich keine -25 sondern -103..

klar -
das Setzen von Bit7 macht aus einem positiven INT8 doch keinen negativen!
Du müsstest auch dazu das 2'Komplement bilden:

25 = 0-001 1001
dann Dein Bit7 setzen:
1-001 1001
==> negative Zahl, liegt damit im 2' Komplement vor
zur Interpretation also nochmal ein 2'Komplement ergibt
-110 0111 = -103 ==> passt schon!

Aber wozu das?
FTemp := -(FTemp);

Was du überhaupt und warum Du den Kram veranstaltest ist mir nicht so klar.

Wenn Du nicht weiter kommst, sag doch einfach mal, was Du erreichen willst!

Gruß
Gunter
E.Faber
 
Avatar
 
Subject:

Re: int8 Vorzeichenproblem

 · 
Posted: 30.07.2010 - 16:52  ·  #3
Hallo Gunter

Vielen Dank für deine Hilfe,
ich möchte die Temperatur eines ds18s20 auslesen und darstellen. Für positive Werte klappt das auch. Nur die negativen machen mir Probleme. Ich habe zwei Byte - eines fürs Vorzeichen und eines mit der Temperatur - als 2'Komplement. Wenn ich das umrechne bekomme ich zwar den korrekten positiven Wert - aber beim umwandeln eben nicht den korrekten negativeb Wert.
Ich bekomme nicht -25 sondern -103. Ich habe angenommen, dass das Bit 7 das Vorzeichen Bit ist.
In der Hilfe steht auch folgendes:

int8
ShortInt

1. Vordefinierter Type. Short Integer.
8bit, 1 Byte, -127..128

daher mein Verdacht, dass der Wert ausserhalb des Wertebereichs liegt.
Wie mache ich denn aus einer positiven 25 eine negative -25 ?

Entschuldigung wenn das absolute Grundlagen sind aber in Delphi oder Lazarus
ist das irgendwie einfacher... :'(

Gruß

Elmar
E.Faber
 
Avatar
 
Subject:

Re: int8 Vorzeichenproblem

 · 
Posted: 30.07.2010 - 17:36  ·  #4
Hallo Gunter,

ach wie peinlich, wie war das mit dem Wald vor lauter Bäumen nicht sehen...

Kann man auch komplette Beiträge wieder löschen??? :'( :'( :'( :'( :'(


Viele Grüße

Elmar

EDIT Gunter:
zumindest als "Mod" könnte ich was löschen.
Aber warum?
Diese "oh-Mann, Hand an die Stirn hau"-Situation kennen wir doch alle.
Peinlich ist das absolut nicht!
Gunter
Administrator
Avatar
Gender:
Location: Frankfurt Main / Germany
Posts: 1697
Registered: 02 / 2003
Subject:

Re: int8 Vorzeichenproblem

 · 
Posted: 30.07.2010 - 17:37  ·  #5
Hi Elmar,

stimmt! In der Online Hilfe ist da ein Schreibfehler (in den Manuals ist es OK)
(ist beim nächsten Update dann auch aus der Hilfe raus).

Aus Integern (beliebiger Länge) macht Du mittels
myInt := -(myInt);
den negativen Wert!

Mit 2'Komplementen hast Du nix zutun!
Bit Operationen sind nur bei binären Variablen sinnvoll (Byte, Word, ...).
Oder auch bei BitSets (ist aber andere "Baustelle").

Quote
aber in Delphi oder Lazarus ist das irgendwie einfacher...

Nö!
Pascal ist eine ausgewachsene Programmiersprache auf die Delphi aufbaut.
OK. OOP, Fensterverwaltung, Events, ... gibt es da natürlich noch nicht
(bzw. beim AVRco schon, in den System-bedingt engen Grenzen).

Aber Bit-Manipulationen sind nur notwendig, wenn man eigene Hardware
ansteuern muss. Arithmeti läuft (mit den verfügbaren Typen) genauso wie
in Delphi!

Gruß
Gunter

p.s.
ich habe Dein letztes Posting ("löschen") mal editiert!
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 15 · Cache Hits: 14   85   99 · Page-Gen-Time: 0.04063s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI