gcc Warnung beheben

Gast #4934206
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!
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
Gast
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
}
Gast
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
}
Gast
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) (...);
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.
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.
Gast
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.