Differenz zweier Zählerstände



  • Hallo,

    ich möchte die Differnz eines 16-Bit Zählers möglichst einfach bilden.
    Wenn der Zähler allerdings seinen Bereich überschreitet ergibt sich ein Problem.
    Für einen 32 Bit Zähler gibt es die C-Anweisung labs. Sie funtioniert nach meiner Erkenntnis nur bei long Datentypen.

    Weiss jemand eine Möglichkeit dies auch für integer(2 Byte) zu berechnen?

    Gruss

    Manfred



  • tita schrieb:

    Für einen 32 Bit Zähler gibt es die C-Anweisung labs. Sie funtioniert nach meiner Erkenntnis nur bei long Datentypen.

    Normalerweise nimmt man dafür einfach abs aus stdlib.h, das einen int-Parameter erwartet. Prinzipiell würde es labs aber auch tun, weil der int dann eben zuerst in einen long umgewandelt wurde und man dann auch wieder einen long zurückbekommt, der normalerweise im Wertebereich von int liegen sollte (produziert evtl eine Compilerwarnung, aber was Gefährliches ist noch nicht passiert). "Normalerweise" deswegen, weil auf vielen Systemen, die intern Zahlen im Zweierkomplementverfahren speichern, der negative Zahlenbereich ein Element mehr umfaßt als der positive (zB: -32768 ... 32767 für 16 bit Integer). Also paßt der Wert von abs(-32768) nicht wieder selbst in einen int. Vielleicht sollte man noch erwähnen, daß der Standard kein bestimmtes Verhalten vorschreibt, was ein System im Falle eines Zahlenüberlaufs tun soll. IdR passiert aber das erwartete.

    Wieso machst Du die Zähler eigentlich nicht unsigned?



  • du kannst einfach den alten zählerstand vom neuen subtrahieren als wenn es keinen überlauf gäbe! klappt allerdings nur, wenn du unsigned int oder unsigned long verwendest! bei short und char klappts nicht weil zahlen kürzer als int vom compiler beim rechnen nach int konvertiert werden.


Anmelden zum Antworten