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
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); |
Funktioniert es eigentlich auch so ? val = (unsigned long) 1<<i;
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 | }
|
@ 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.