Ergebnis: solange ich zu negativen Zahlen komme, steht in Array statt
wie erwartet -2, -4, -6 ( 0xFFFE, 0xFFFC, 0xFFFA ) einfach 254, 252, 250
( 0x00FE, 0x00FC, 0x00FA ).
D.h. Problem liegt in casting. Aber wo ich Fehler mache, konnte ich
nicht capieren. Ich habe schon versucht, casting in 2 Schritten zu
machen, zuerst eine Zwischenvariable als signed char, dann eine
Zwischenvariable als int, erst danach in Array - immer gleiche
Ergebnis...
AVR Studio 4.18 und gcc-5.4.0.
Vielen Dank für die Erklärung im voraus!
Danke!
Ich habe nun verstanden, wo mein Fehler lag...
Ich habe auch die Variante mit Zwischenvariable char ausprobiert. Aber
ich ging davon aus, daß char signed ist.
Maxim B. schrieb:> int *y;> *y += (int)xx;
Du brauchst das xx übrigens danach nicht mehr nochmal explizit nach int
zu casten. Wenn Du ein signed char und ein int addierst wird die ganze
Rechnung automatisch mit int ausgeführt, beide Operanden werden zuvor
automatich nach int promoted oder falls größer als int dann zum größten
Datentyp der in dem Ausdruck vorkommt, mindestens jedoch zu int oder
falls alle unsigned sind dann zu unsigned int. Stichwort zum Googeln:
Integer-Promotion.
Und am Rande, falls Du mal drüberstolperst, behalte auch im Hinterkopf
daß auf dem AVR ein int 16 Bit lang ist, auf größeren Platformen meist
32 Bit.
Maxim B. schrieb:> Danke!> Ich habe nun verstanden, wo mein Fehler lag...> Ich habe auch die Variante mit Zwischenvariable char ausprobiert. Aber> ich ging davon aus, daß char signed ist.
Leider ist es in C nicht wie bei allen anderen Integer-Typen so, dass es
automatisch signed ist, wenn nichts explizit davor steht. Es ist vom
Compiler und dessen Einstellungen abhängig. Es gibt dann drei als
verschieden zu betrachtende Typen: char, signed char und unsigned char.
Ersteres nimmt man für Text, während man für Binärdaten immer die beiden
letzteren verwendet.
Und da unter C noch nicht mal die Anzahl der Bits eines Variablentyps
festgelegt sind, bindet man noch besser die Datei stdint.h ein und
benutzt deren Typen.
Bei uint8_t ist dann alles klar.
fop schrieb:> Bei uint8_t ist dann alles klar.
Nur bei AVR Studio 4 weniger bequem, weil diese Typen nicht automatisch
von Programm beim Schreiben blau gemacht werden. Das bringt mehr Gefahr,
Fehler zu machen. Nur aus diesem Grund bleibe ich bei gewöhnlichen
Typen.
AVR Studio 4 ist weit von Vollkommenheit. Z.B. hier ist gar nicht
möglich, in Watch-Fenster die Variablen uint24_t zu beobachten, die bei
heutigem GCC längst möglich sind. Aber einfache IDE, für AVR
ausreichend, aus IDE kann man Programm direkt in Mikrocontroller
schreiben... Bequem...
fop schrieb:> Und da unter C noch nicht mal die Anzahl der Bits eines Variablentyps> festgelegt sind, bindet man noch besser die Datei stdint.h ein und> benutzt deren Typen.> Bei uint8_t ist dann alles klar.
Und wenn man schreibfaul ist wie ich macht man es wie die ehrwürdigen
Kernelhacker und macht sich typedefs nach dem Vorbild in linux/types.h
u8
s8
u16
s16
u32
s32
u64
s64