Forum: Mikrocontroller und Digitale Elektronik gcc Warnung beheben


von Lars (Gast)


Lesenswert?

Hallo,

ich habe folgende Fehlermeldung im Atmel Studio "Warning right shift 
count >= width of type"

kann mir jemand bitte sagen was der compiler mir damit sagen will und 
wie ich diese beheben kann?
1
static void setValue (uint64_t ui64Val)
2
{
3
  ucTxBuffer[3]= ui64Val >> 32;
4
  ucTxBuffer[4]= ui64Val >> 24;
5
  ucTxBuffer[5]= ui64Val >> 16;
6
  ucTxBuffer[6]= ui64Val >> 8;
7
  ucTxBuffer[7]= ui64Val >> 0xFF00000000;
8
}

Danke!

von Brummbär (Gast)


Lesenswert?

Lars schrieb:
> 0xFF00000000;

Was steht da in Dezimal übersetzt?

von Christopher B. (chrimbo) Benutzerseite


Lesenswert?

Lars schrieb:
> ucTxBuffer[7]= ui64Val >> 0xFF00000000;

du schiebst ja auch um 1095216660480 Stellen nach rechts. Sollte das 
eventuell ein & sein? Bzw. ein & 0xff?

von Dennis S. (eltio)


Lesenswert?

Als Orientierung:

"right shift count": Hat wohl was mit der Anzahl der Stellen zu tun um 
die du schieben möchtest.
"width of type": Ist die Breite des Datentyps den du nutzen möchtest.

Der Compiler zeigt dir sicherlich eine Zeile an die du dir genauer 
ansehen solltest. Vergleiche mal alle Größen die so vorkommen...

Gruß
Dennis

von Hans S. (Gast)


Lesenswert?

Alles über 32bit ist in C für einen Shift nicht definiert, daher die 
Warnung.

von Dennis S. (eltio)


Lesenswert?

Hans S. schrieb:
> Alles über 32bit ist in C für einen Shift nicht definiert, daher
> die
> Warnung.

Àus Interesse: hast du dafür eine Quelle?

Gruß
Dennis

von Lars (Gast)


Lesenswert?

Christopher B. schrieb:
> du schiebst ja auch um 1095216660480 Stellen nach rechts. Sollte das
> eventuell ein & sein? Bzw. ein & 0xff?

behoben danke :-)
1
static void setValue (uint64_t ui64Val)
2
{
3
  ucTxBuffer[3]= ui64Val >> 32;
4
  ucTxBuffer[4]= ui64Val >> 24;
5
  ucTxBuffer[5]= ui64Val >> 16;
6
  ucTxBuffer[6]= ui64Val >> 8;  
7
  ucTxBuffer[7]= ui64Val & 0xFFFFFFFFFF;
8
}

von Peter II (Gast)


Lesenswert?

Lars schrieb:
> behoben danke :-)

sieht aber immer noch merkwürdig aus.


ucTxBuffer wird wohl 8 bit sein, warum dann nicht sinnvoll mit & 0xFF?

Dann müsste man überall das & machen, oder lass es überall weg.

von Lars (Gast)


Lesenswert?

Peter II schrieb:
> ucTxBuffer wird wohl 8 bit sein, warum dann nicht sinnvoll mit & 0xFF?

ucTxBuffer ist
1
uint8_t

stimmt besser dann so:
1
 ucTxBuffer[7]= ui64Val & 0xFF;

wäre auch sowas möglich?
1
static void setValue (uint64_t ui64Val)
2
{
3
  ucTxBuffer[3]= ui64Val >> 32;
4
  ucTxBuffer[4]= ui64Val >> 24;
5
  ucTxBuffer[5]= ui64Val >> 16;
6
  ucTxBuffer[6]= ui64Val >> 8;  
7
  ucTxBuffer[7]= ui64Val >> 0;
8
}

von Lars (Gast)


Lesenswert?

Hans S. schrieb:
> Alles über 32bit ist in C für einen Shift nicht definiert, daher die
> Warnung.

wo bekommt man so eine Info?

von Dr. Sommer (Gast)


Lesenswert?

Lars schrieb:
> wo bekommt man so eine Info?

Nur hier, denn sie ist falsch. Bei 64Bit unsigned Typen sind shifts bis 
63 Bit definiert.

Lars schrieb:
> ucTxBuffer[7]= ui64Val >> 0;

Warum so kompliziert...
ucTxBuffer [7] = ui64Val;

Falls der Compiler über narrowing conversion  warnt (das tut er dann bei 
allen Zeilen) hilft casten:

ucTxBuffer [...] = (uint8_t) (...);

von S. R. (svenska)


Lesenswert?

Dennis S. schrieb:
>> Alles über 32bit ist in C für einen Shift
>> nicht definiert, daher die Warnung.
> Àus Interesse: hast du dafür eine Quelle?

Nein, weil das so nicht stimmt.

Richtig ist, dass ein N Bit-Shift auf einem Datentypen mit N Bit Breite 
(oder kleiner) implementation-defined ist.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Wobei da die Bitbreite nach Promotion zählt. Auf einer 32-Bit 
Plattform (int ist 32 Bits breit) ist es also kein Problem, einen 
unsigned 16-Bit Wert um 24 zu schieben, also z.B.
1
uint16_t shift (uint16_t x)
2
{
3
    return x >> 24;
4
}

von Jim M. (turboj)


Lesenswert?

S. R. schrieb:
> Dennis S. schrieb:
>>> Alles über 32bit ist in C für einen Shift
>>> nicht definiert, daher die Warnung.
>> Àus Interesse: hast du dafür eine Quelle?
>
> Nein, weil das so nicht stimmt.
>
> Richtig ist, dass ein N Bit-Shift auf einem Datentypen mit N Bit Breite
> (oder kleiner) implementation-defined ist.


Galt das nicht nur für die vorzeichenbehafteten Typen? Der OP nimmt mit 
uint64_t aber einen vorzeichenlosen Typ - dort sollte das Ergebnis IMHO 
klar definiert sein.

von Ralf G. (ralg)


Lesenswert?

Johann L. schrieb:
> Auf einer 32-Bit
> Plattform (int ist 32 Bits breit) ist es also kein Problem, einen
> unsigned 16-Bit Wert um 24 zu schieben

Ich hätte hier jetzt die selbe Warnung wie im Eingangspost erwartet.?!
[ Der Wertebereich des Ergebnisses ist ja seeehr überschaubar ;-) ]

von Mikro 7. (mikro77)


Lesenswert?

Ralf G. schrieb:
> Ich hätte hier jetzt die selbe Warnung wie im Eingangspost erwartet.?!
> [ Der Wertebereich des Ergebnisses ist ja seeehr überschaubar ;-) ]

Nö. Da steht ja auch warum. Mit sinnvollen Einstellungen (gcc 
-Wconversion) kommt allerdings eine andere.

von S. R. (svenska)


Lesenswert?

Jim M. schrieb:
> Galt das nicht nur für die vorzeichenbehafteten Typen?

Nein, dass hat damit zu tun, dass manche Prozessoren Bitshifts jenseits 
der Wortbreite unterschiedlich implementieren. Dadurch, dass C das 
Verhalten dann nicht spezifiziert, darf der Compiler immer die Hardware 
benutzen.

von Dr. Sommer (Gast)


Lesenswert?

Jim M. schrieb:
> Galt das nicht nur für die vorzeichenbehafteten Typen?
Nein, für die sind alle Rechts-Shifts implementation defined, und alle 
links Shifts, welche mindestens so groß wie der Typ selber sind. Bei 
unsigned Typen gilt nur letzteres, aber für links&rechts-Shifts.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Dr. Sommer schrieb:
> Jim M. schrieb:
>> Galt das nicht nur für die vorzeichenbehafteten Typen?
> Nein, für die sind alle Rechts-Shifts implementation defined,

Nö, doch nur bei solchen Werten bei welchen das höstwertigste Bit 
gesetzt ist?

Ich lass mich da aber gerne eines besseren belehren.

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.