www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 32BIT unsigned int auf 16Bit uP?


Autor: Globi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Kann mir jemand sagen wie ich eine 32Bit Variable definieren muss damit 
dies dann über den Compiler auf einem 16Bit uP läuft?
Ich arbeite mit dem PIC24FJ128 und dem Compiler MPC30.

Mit diesem Code bekomme ich 0x0000FFFF als Ausgabe, sollte aber 
0xFFFFFFFF sein...


long unsigned int test = 0xFFFFFFFF;
printf("test = %.8X \n\r", test);



Danke

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
printf("test = %.8lX \n\r", test);

Autor: Globi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. K. schrieb:
> printf("test = %.8lX \n\r", test);

Ok, passt so, vielen Dank, aber für was steht die 1?

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
l "el" für long :-)

Autor: Globi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, danke

Autor: Thosch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Globi schrieb:

> Ok, passt so, vielen Dank, aber für was steht die 1?
Nein, das ist keine Eins, das ist ein kleines "L".
und das steht für Long.

Gruß,
Thorsten

Autor: Thosch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
upps, zu langsam...

Autor: Globi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke @ all für die schnellen Antworten, hatte schon Zweifel am 
Compiler...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Globi schrieb:
> danke @ all für die schnellen Antworten, hatte schon Zweifel am
> Compiler...

Du solltest eher Zweifel an deinem C-Buch haben.
Ooops. Du hast gar keines?
Na, da haben wirs doch!

Autor: Alfred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Globi,

ich kenne Deinen Compiler nicht, aber beim GCC kann man mit den 
(Kommandozeilen) Parametern -Wall -Werror veranlassen, dass der Compiler 
ALLE Warnungen als Fehler behandelt und den Übersetzungsvorgang 
abbricht. Bei Deinem Problem hätte Dir dann der Compiler gesagt, dass 
das Format '%.8X' nicht zu dem Parameter 'test' passt.

Nur so als Hinweis ;-)

Beste Grüße

Alfred

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
long unsigned int test = 0xFFFFFFFF;  // ??? finde ich lustig!
unsigned long test     = 0xFFFFFFFF;  // is wohl besser so...

Autor: Thosch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Long-Konstanten sollte man übrigens auch besser mit angehängtem
L (signed long) bzw. UL (unsigned long) definieren.
also z.B.:
unsigned long test = 0xFFFFFFFFUL;

Viele Compiler werfen 'ne Warning "Constant is long" oder ähnlich, wenn 
man's nicht tut...

Gruß,
Thorsten

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter schrieb:

> long unsigned int test = 0xFFFFFFFF;  // ??? finde ich lustig!
> unsigned long test     = 0xFFFFFFFF;  // is wohl besser so...

Ist exakt gleichwertig.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thosch schrieb:

> Viele Compiler werfen 'ne Warning "Constant is long" oder ähnlich, wenn
> man's nicht tut...

Welcher Compiler ist "viele"?
Halte ich nämlich nicht für eine brilliante Idee.

Autor: Oleg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. K. schrieb:
> Thosch schrieb:
>
>> Viele Compiler werfen 'ne Warning "Constant is long" oder ähnlich, wenn
>> man's nicht tut...
>
> Welcher Compiler ist "viele"?

Ich kenne es auch vom AVR-GCC.

> Halte ich nämlich nicht für eine brilliante Idee.

Warum ?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oleg schrieb:

> Ich kenne es auch vom AVR-GCC.

gcc auf 64-bit Linux sagt es in einem vergleichbaren Fall nicht.

> Warum ?

Portabilität.

Dadurch werden Daten und Rechnungen unnötig aufgeblasen. Wenn auf einer 
Maschine mit sizeof(long)=4 und sizeof(int)=2 alle Konstanten >int mit L 
oder UL versehen werden, dann kriegt man in einer Umgebung mit 
sizeof(long)=8 und sizeof(int)=4 unnötigerweise 64bit-Werte und 
Berechnungen. Und anschliessend wundert sich der sensibel eingestellte 
Compiler, dass er die in eine 32bit Variable schreiben soll (weil man 
uint32_t verwendet hat).

Letztlich müsste man dann konsequenterweise überall sowas grausliches 
hinschreiben wie:
  ((uint32_t)0xFFFFFFFFuL)

Im Kontext von Mikrocontroller ist das zwar noch nicht relevant, aber es 
gibt ja auch andere Umgebungen.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oleg schrieb:

> Ich kenne es auch vom AVR-GCC.

Hast du ein Beispiel? Ich finde grad keines mit so einer Meldung.

Autor: Andreas Ferber (aferber)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei Angabe der Konstanten in Hex-Form fällt mir hier jetzt auf Anhieb 
auch kein problematischer Punkt ein.

Eine subtile Falle kann allerdings bei bestimmten dezimalen Konstanten 
lauern (Beispiel auf x86, also mit 32 Bit long):
#include <stdio.h>

long long i = -2147483648;

int main(void)
{
        printf("%lld\n", i);
        return 0;
}
% gcc -std=iso9899:1990 -g -O2 -W -Wall -o large large.c
large.c:3: warning: this decimal constant is unsigned only in ISO C90
% ./large
2147483648
% gcc -std=iso9899:1999 -g -O2 -W -Wall -o large large.c
% ./large
-2147483648

"long long" ist hier natürlich im C90-Fall eine GCC-Erweiterung, 
nichtsdestotrotz ist das Ergebnis "überraschend".

Der Hintergrund ist, dass es in ANSI-C eigentlich keine negativen 
Konstanten gibt. "-2147483648" ist die Konstante "2147483648", auf die 
dann eine Negation angewendet wird. In C90 ist "2147483648" nicht mehr 
in einem long darstellbar (soweit long 32 Bits hat), daher ist das dann 
ein unsigned long, und auch die Negation wird dann mit unsigned long 
gerechnet (so unsinnig das auch erstmal klingen mag), das Ergebnis 
bleibt positiv. In C99 wird dagegen auf long long (minimal 64 Bits) 
statt unsigned long zurückgegriffen, daher führt dann die Negation auch 
wirklich zu einem negativen Wert.

Andreas

Autor: fragender (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>long unsigned int test = 0xFFFFFFFF;

????????
Ist das zulässig bzw. sinnvoll?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
fragender schrieb:

> Ist das zulässig bzw. sinnvoll?

Weshalb sollte es das nicht sein?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.