gcc Warnung beheben

Gast #4934206
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!
#4934215
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
Gast #4934231
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
}
Gast #4934245
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
}
Gast #4934249
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) (...);
#4934336
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.
Gast #4934392
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.

Antwort schreiben

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.

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.