Forum: Mikrocontroller und Digitale Elektronik Vorzeichen bei Variable entfernen


von C. H. (hedie)


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!
1
int Diode = 185;
2
  int Sensor = 100;
3
  signed int Resultat2 = 0;
4
  int Resultat = 0;
5
  unsigned char ucVorzeichen = 0;  //0 = plus 1 = minus
6
  Resultat2 = Sensor - Diode;
7
  if(Resultat2 < 0)
8
  {
9
    ucVorzeichen = 1;
10
    Resultat = labs(Resultat2);
11
    status(1);
12
  }
13
  Resultat = ((Resultat * 488) / 100);

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

Woran kann das liegen?

von Lukas K. (carrotindustries)


Lesenswert?

Claudio Hediger schrieb:
> Woran kann das liegen?

Versuch mal utoa.

von Stefan B. (steckersammler)


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.

von heinzhorst (Gast)


Lesenswert?

1
if(Resultat2 < 0){
2
  Resultat2 = -Resultat2;
3
  ...
4
}

von Floh (Gast)


Lesenswert?

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

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

von C. H. (hedie)


Lesenswert?

Hat perfekt geklappt... vielen dank :)

Wie konnte ich nur das unsigned vergessen :)

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
Noch kein Account? Hier anmelden.