Forum: Mikrocontroller und Digitale Elektronik integer operation out of range warning


von Mr. Starter (Gast)


Lesenswert?

Moin

könnt ihr mir kurz erklären, wie ich die Warnmeldungen wegbekomme wenn 
ich
1
LPC_GPIO1->FIOSET = (1 << 31);
schreibe?

Warnungen:
- integer operation result is out of range
- integer operation resulted in a change of sign


Vielen Dank.

Gruß
Starter

von Huch (Gast)


Lesenswert?

Nun. Wie sieht denn ein Integer binär aus?
Zeichne Dir das mal auf, dann kommst Du selbst drauf.

von Mr. Starter (Gast)


Lesenswert?

damn - 1 << 30 und nicht 31, richtig???

von g457 (Gast)


Lesenswert?

> LPC_GPIO1->FIOSET = (1 << 31);
> Warnungen:
> - integer operation result is out of range
> - integer operation resulted in a change of sign

Ich vermute jetzt einfach mal drauf los dass auf dem (ungenannten) 
Zielsystem der Integer zu klein ist (womöglich 16 Bits?). Caste die 1 in 
einen (ggf. unsigned) 32-Bit und es sollte klappern.

HTH

von Mr. Starter (Gast)


Lesenswert?

1
LPC_GPIO1->FIOSET |= 0x80000000;

wenn ich es so schreibe, dann gibt es keine Fehlermeldung. Als 
Zielsystem muss ein lpc2136 (32bittig) herhalten.

von Klaus W. (mfgkw)


Lesenswert?

g457 schrieb:
> Ich vermute jetzt einfach mal drauf los dass auf dem (ungenannten)
> Zielsystem der Integer zu klein ist (womöglich 16 Bits?).

Dann käme diese Meldung nicht:

Mr. Starter schrieb:
> - integer operation resulted in a change of sign

Nebenbei: FIOSET scheint signed zu sein.
Wenn man so etwas macht, wäre unsigned vielleicht der bessere Datentyp?

von Mr. Starter (Gast)


Lesenswert?

Klaus Wachtler schrieb:
> Nebenbei: FIOSET scheint signed zu sein.
> Wenn man so etwas macht, wäre unsigned vielleicht der bessere Datentyp?
danke für den Hinweis mal in der Definition von FIOSET nachzusehen, 
allerdings ist diese unsigned int
1
__IO uint32_t FIOSET;

von Sequence Point (Gast)


Lesenswert?

meckert er auch für "(1u << 32)" ?

von Sequence Point (Gast)


Lesenswert?

(1u << 31) natürlich...

von Mr. Starter (Gast)


Lesenswert?

Sequence Point schrieb:
> meckert er auch für "(1u << 32)" ?

nein jetzt meckert er nicht mehr... kannst du mir noch die Auflösung 
sagen, dann schreib´ich sie mir gleich neben den code...

Danke schon mal

von Sequence Point (Gast)


Lesenswert?

1 ist ein signed integer, wenn du den 31-mal verschiebst, setzt du das 
MSB und das Vorzeichen ändert sich. Deshalb warnt der compiler.
1u ist unsigned. Das lässt sich natürlich 31-mal schieben, ohne das sich 
das Vorzeichen (welches Vorzeichen?) ändert.

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.