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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren