Forum: Compiler & IDEs AVR-Gcc probleme mit unsigned long (32bit) shift operationen


von Tobias (Gast)


Lesenswert?

Moin, moin,

habe ein kleines Problem mit Shift-operationen bei unsigned long.
Umgebug: atmega128, avr-gcc 4.1.1, avr-libc: 1.4.5

habe im forum leider nicht wirklich was gefunden, müssen irgendwelche 
gcc-parameter gesetzt werden ?

code:

unsigned char i;
unsigned long val;

for (i=0;i<31;i++) {
   val = (unsigned long) (1<<i);
   printf ("(%d): %lX\n",i, val);
}

ergebnis sieht dann so aus:
(0): 1
(1): 2
(2): 4
(3): 8
(4): 10
(5): 20
(6): 40
(7): 80
(8): 100
(9): 200
(10): 400
(11): 800
(12): 1000
(13): 2000
(14): 4000
(15): FFFF8000
(16): 0
(17): 0
(18): 0
(19): 0
(20): 0
(21): 0
(23): 0
(24): 0
(25): 0
(26): 0
(27): 0
(28): 0
(29): 0
(30): 0

von Stefan E. (sternst)


Lesenswert?

1
val = (unsigned long) (1<<i);

Die 1 ist nur ein int und kann daher nur 15 mal geschiftet werden.
Ändere es in:
1
val = (1UL<<i);

von Benedikt K. (benedikt)


Lesenswert?

Funktioniert es eigentlich auch so ?
val = (unsigned long) 1<<i;

von Sven P. (Gast)


Lesenswert?

Tobias wrote:
1
 for (i=0;i<31;i++) {
2
    val = (unsigned long) (1<<i);
3
    printf ("(%d): %lX\n",i, val);
4
 }

Das ist Bullschitt. Weißt du, welche Freude du deinem AVR machst, mit 
der (1<<i)-Schieberei? Und das mit dem (unsigned long) ist auch nich der 
Renner. Mach lieber sowas hier:
1
uint32_t schubs = 1;
2
uint8_t i;
3
4
for (i = 0; i < 31; i++) {
5
  printf("(%d): %lX\n", i, schubs);
6
  schubs <<= 1;
7
}

von Stefan E. (sternst)


Lesenswert?

@ Benedikt K.:

> Funktioniert es eigentlich auch so ?
> val = (unsigned long) 1<<i;

Ja, sollte es, denn der Type-Cast bindet stärker als der <<-Operator.

@ Sven Pauli:

> Das ist Bullschitt.

Oh mann, das ist doch offensichtlich nur etwas Testcode, um zu 
illustrieren, dass das Schiften sich nicht so verhält, wie er es 
erwartet hätte.

von Sven P. (Gast)


Lesenswert?

Also so offensichtlich ist das für mich net... kommt dann nachher zwei 
Freds später "Warum dauert schieben so lange?", oder wie? Nix für ungut 
:-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.