Unterschied zw. ^ und ~

OP #2773185
Hallo,

ich habe eine Variable
1
uint16_t Frequenz;
und am kompletten PortB des ATtiny2313 sind Taster angeschlossen.
Über diese Taster wird ein Wert (8 Bit, da 8 Taster) in den AVR eingeben 
(0 bis 255).
Dieser Wert soll zu 875 dazu gerechnet werden.
Soweit wäre das ja auch kein Problem, würde das einfach so machen:
1
Frequenz = 875 + PINB;
Da aber die Taster die Pins auf GND ziehen die internen Pullups 
aktiviert sind, muss ich die einzelnen Bits in 'PINB' zuvor invertieren.
Eigentlich wollte ich es so machen:
1
Frequenz = 875 + ~PINB
Aaber irgentwie hat das nicht so gut geklappt, da fehlt immer irgentwas.
Das hier...
1
Frequenz = 875 + (PINB ^ 0xFF);
...funktioniert perfekt.

Kann mir jemand auf die Sprünge helfen, was der Unterschied zwischen 
diesen beiden Varianten ist, und warum das eine funktioniert, aber das 
andere nicht?

Gruß
Doran
PINB ^ 0xFF macht keinen Sinn, auch wenn das richtige Ergebnis 
rauskommt. Du willst negieren, also schreibt man das auch besser so hin 
(~PINB).
Es drückt dann die Absicht aus und verwirrt nicht.

Wenn du schreiben würdest, was nicht geht bzw. was falsch rauskommt, 
könnte man sinnvoller helfen.
Bis dahin gehe ich davon aus, daß nicht das Negieren Probleme macht, 
sondern die signed-Rechnung, wo du eigentlich unsigned haben willst (875 
ist erstmal int, also signed, und die Addition wird deshalb in signed 
durchgeführt, wofür dein Port-Wert entsprechend erweitert wird und bei 
gesetztem obersten Bit entsprechend falsch).
Klaus Wachtler schrieb:
> Bis dahin gehe ich davon aus, daß nicht das Negieren Probleme macht,
> sondern die signed-Rechnung, wo du eigentlich unsigned haben willst (875
> ist erstmal int, also signed, und die Addition wird deshalb in signed
> durchgeführt, wofür dein Port-Wert entsprechend erweitert wird und bei
> gesetztem obersten Bit entsprechend falsch).

Nein, denn ein Port ist als uint8_t definiert, es findet also keine 
Vorzeichenerweiterung statt. Das Problem entsteht tatsächlich beim 
Invertieren, denn die Erweiterung auf int findet natürlich vorher statt.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.