Forum: Mikrocontroller und Digitale Elektronik gcc Warnung beheben


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Lars (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Lars schrieb:
> 0xFF00000000;

Was steht da in Dezimal übersetzt?

von Christopher B. (chrimbo) Benutzerseite


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


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

von Dennis S. (eltio)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
2 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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


Bewertung
0 lesenswert
nicht 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.

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]
  • [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.