AVR-Gcc probleme mit unsigned long (32bit) shift operationen

Gast #882550
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
Gast #882601
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
}
#882611
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.

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