www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Vorzeichen bei Variable entfernen


Autor: Claudio H. (Firma: BLS-Electronics) (hedie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich habe eine signed Int variable...

In dieser befindet sich nun ein negativer Wert...
Das kann ich durch eine IF abfrage prüfen...

Nun möchte ich diesen wert in eine Variable vom Typ int (also ohne 
vorzeichen) schreiben...

Dazu habe ich abs(variable) sowie labs(Variable) versucht... Beide 
funktionieren jedoch nicht!
int Diode = 185;
  int Sensor = 100;
  signed int Resultat2 = 0;
  int Resultat = 0;
  unsigned char ucVorzeichen = 0;  //0 = plus 1 = minus
  Resultat2 = Sensor - Diode;
  if(Resultat2 < 0)
  {
    ucVorzeichen = 1;
    Resultat = labs(Resultat2);
    status(1);
  }
  Resultat = ((Resultat * 488) / 100);


Merkwürdigerweise kommt nach der Umwandlung mit itoa eine Negative zahl 
heraus obwohl int ja nicht negativ sein kann!
uart_puts("Resultat: ");
    uart_puts( itoa(Resultat , String, 10)  );

Woran kann das liegen?

Autor: Lukas K. (carrotindustries)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Claudio Hediger schrieb:
> Woran kann das liegen?

Versuch mal utoa.

Autor: Stefan B. (steckersammler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das liegt daran, dass int ein signed Typ ist (auch wenn du das nicht 
dazuschreibst)...

Wenn du unsigned willst, musst du das natürlich extra angeben.
Auf den AVRs kannst du z.B. die Typen uint8_t, uint16_t, ... verwenden.

Die Funktion labs() ist für long-Werte gedacht, abs() müsste die 
richtige sein.
Außerdem erwartet itoa eine signed Variable (und bekommt sie in deinem 
Beispiel auch). Für unsigned nimm utoa.

Autor: heinzhorst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

if(Resultat2 < 0){
  Resultat2 = -Resultat2;
  ...
}


Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Claudio Hediger schrieb:
> if(Resultat2 < 0)
>   {
>     ucVorzeichen = 1;
>     Resultat = labs(Resultat2);
>     status(1);
>   }

umständlich.
wie wärs mit
if(Resultat2 < 0)
{
  Result = -Result2;
}
ob der Rest mit status und Vorzeichen noch rein muss, musst du wissen.
:-)

Autor: Claudio H. (Firma: BLS-Electronics) (hedie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat perfekt geklappt... vielen dank :)

Wie konnte ich nur das unsigned vergessen :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.