Hallo Zusammen, der digitale Thermometer-IC Maxim DS18B20 stellt negative Temperaturen im "two’s complement" - Format dar. Es werden daher zusätzliche Verarbeitungsschritte (bitweise Invertierung und eine Addition von 1) nötig. Positive Werte hingegen können "direkt" ausgelesen werden. Was ist der Hintergrund einer solchen Darstellung negativer Zahlen, warum (bzw. in welchen Fällen) ist sie vorteilhaft? Frank
Frank schrieb: > Was ist der Hintergrund einer solchen Darstellung negativer Zahlen, > warum (bzw. in welchen Fällen) ist sie vorteilhaft? 1. Wie sollte man sie sonst darstellen? 2. guck dir mal an, wie ganze Zahlen im Normalfall dargestellt werden.
Es gibt extra Bits für das Vorzeichen. Von daher könnten abgesehen davon negative genauso wie positive Zahlen dargestellt werden? Frank
Frank schrieb: > Von daher könnten abgesehen davon negative genauso wie positive Zahlen > dargestellt werden? Nimm mal den Wert 0xff und erhöhe die Zahl um eins. Egal ob du das als -1 oder 255 interpretierst, muss der µC genau das selbe machen. Ob du die 0xff als negative Zahl oder als positive Zahl interpretierst, ist alleine deine Sache.
@ Frank (Gast) >der digitale Thermometer-IC Maxim DS18B20 stellt negative Temperaturen >im "two’s complement" - Format dar. Sieht so aus. > Es werden daher zusätzliche >Verarbeitungsschritte (bitweise Invertierung und eine Addition von 1) >nötig. Eben NICHT! Mit dem 2er Komplement kann man ganz normal rechen wie mit vorzeichenlosen Zahlen! Soagr in ASM! >Was ist der Hintergrund einer solchen Darstellung negativer Zahlen, >warum (bzw. in welchen Fällen) ist sie vorteilhaft? Siehe oben!
Frank schrieb: > Was ist der Hintergrund einer solchen Darstellung negativer Zahlen, > warum (bzw. in welchen Fällen) ist sie vorteilhaft? Stell Dir die Ziffernfolge bei einem Binärzähler vor (hier, als Beispiel, 4-stellige FF-Kette, der hat dann nach 0000 die 1111 als nächsten Schritt) 0011 3 3 >erste Spalte binär 0010 2 2 >zweite Spalte nur Zuordnung für pos. Zahlen 0001 1 1 >dritte Spalte Zuordnung der neg.Zahlen 0000 0 0 1111 ? -1 > dann ist doch die Zuordnung ganz logisch, oder? 1110 ? -2 1101 ? -3 1100 ? -4 Wenn Du dann die binärfolge abwärts gehst, kommen die Zahlen 3-2-1-0-? Welche Zahl kommmt da nach 0, wenn auch negative Zahlen möglich sind? Bei einer 8-stelligen Zahl folgt beim Abwärtszählen also logischerweise ff nach 00, so wie beim Abwärtszählen nach 0 die -1 kommt. An der Viererreihe sieht man auch den Versatz von 1 in der Nummerierung, weshalb die komische Addition von 1 notwendig ist. und wenn man die 256 Zahlen von 0 bis 255 gleich aufteilt, gilt halt 0 bis 127 als positiv und 128 bis 255 als negativ. praktisch ist dann gleich, dass das erste bit als Vorzeichenbit wirksam wird. und noch toller wird es, wenn Du 0000 0010 und 1111 1111 adddierst. Dann kommt 0000 0001 (mit Übertrag ins 9.bit) heraus, also eine brave 1, so wie bem Addieren von 2 und -1 Man opfert zwar den Zahlenumfang der pos.Zahlen zur Hälfte zugunsten der negativen, hat aber eine klare Markierung ,ob pos oder neg und dazu funktionieren einige Rechenoperationen wie zuvor.
:
Bearbeitet durch User
Frank schrieb: > Es werden daher zusätzliche > Verarbeitungsschritte (bitweise Invertierung und eine Addition von 1) > nötig. Nur wenn Du in Assembler ohne Standard-Libs unterwegs bist. Das "two’s complement" - Format ist das Leib und Magen Format einer CPU und quasi der Standard. Man kann daher direkt die Temperatur mit Vorzeichen anzeigen:
1 | int16_t val = read_DS18B20; |
2 | printf("Temperatur: %5.1f °C\n", ((float)val) / 16.0; |
Peter D. schrieb: > Man kann daher direkt die Temperatur mit Vorzeichen anzeigen: int16_t > val = read_DS18B20; > printf("Temperatur: %5.1f °C\n", ((float)val) / 16.0; Wieso eigentlich der Datentyp float für eine Zahl, die gerade mal den Dynamikbereich von -55 °C bis 125 °C umfasst. Da wird eine 16 Bit-Zahl ohne Notwendigkeit auf 32 Bit aufgebläht und dabei noch 8 Bit für einen völlig nutzlosen Exponenten verschwendet, ganz zu schweigen von dem erheblichen Rechenaufwand für den Umgang mit Float-Zahlen.
Weil es am bequemsten für die formatierte Ausgabe ist. Wer's sparsamer mag, nimmt Festkommaarithmetik.
Wolfgang schrieb: > Wieso eigentlich der Datentyp float Weil man damit am einfachsten Kommazahlen ausgeben kann. Zu beachten ist die Wandlung nach float vor der Division / 16.0. Für ganze °C kann man natürlich bei int bleiben. Es gibt auch keinen Grund mehr, float/printf zu fürchten, schließlich haben selbst 8-Pinner üppig Flash (ATtiny85: 8kB).
@ Peter Dannegger (peda) >Es gibt auch keinen Grund mehr, float/printf zu fürchten, schließlich >haben selbst 8-Pinner üppig Flash (ATtiny85: 8kB). Hast du Atmel-Aktien gekauft? ;-)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.