[C] Warning przy przesuwaniu bajtów do zmiennej unsigned long long


(DarthVader3105) #1

Witam

Przy pisaniu programu natknąłem się na pewien problem:

uint64var = ( *(allocatedMemory+uint64var) & 0xff) + (( *(allocatedMemory+uint64var + 1) & 0xff) << 8) + (( *(allocatedMemory+uint64var + 2) & 0xff) << 16) + (( (allocatedMemory+uint64var + 3) & 0xff) << 24)
+ ((
(allocatedMemory+uint64var + 4) & 0xff) << 32) + (( *(allocatedMemory+uint64var + 5) & 0xff) << 40) + (( *(allocatedMemory+uint64var + 6) & 0xff) << 48)
+ (( *(allocatedMemory+uint64var + 7) & 0xff) << 56);

Pojawia mi się dla trzech ostatnich przesunięć warning: left shift count >= width of type
Próbowałem również przetestować przesuwanie przy użyciu pętli for, ale nie zapisały się dane jak powinny.

for(i = 0; i < 8; ++i)
{
x[i] = i + 2;
y = (x[i] & 0xff) << przesuniecie;
przesuniecie += 8;
}

Gdy sprawdzam wartość if ( y == 0x0908070605040302 ), instrukcja warunkowa się nie wykonuje.
Co jest źle, i dlaczego nie mogę przesunąć wartości do najstarszych bitów typu 64-bitowego?


(Rolek0) #2

Jakie są typy zmiennych?

Jeśli pośrednie wyniki są 32-bitowe to nie możesz przesunąć o więcej niż 31 bitów.


(DarthVader3105) #3

Może to dlatego :frowning2: Typów zmiennych używam z innej biblioteki, ale to zapewne i tak tylko makra. uint64var to jak w nazwie Uint64, a allocatedMemory to Uint8 *.
W drugim przypadku x[] to tablica Uint8, y to Uint64, a przesuniecie to też Uint8.

Gdybym na przykład stosował rzutowania do unsigned long long to dy wtedy działało?


(Rolek0) #4

[quote=“DarthVader3105, post:3, topic:528061”]Gdybym na przykład stosował rzutowania do unsigned long long to dy wtedy działało?[/quote]Tak, musisz rzutować przesuwaną wartość przed przesunięciem.


(DarthVader3105) #5

Ok, dzięki wielkie. :slight_smile: