www.mikrocontroller.net

Forum: Compiler & IDEs Ist unsigned char default?


Autor: Jochen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Huhu,

kurze Frage:
Wenn ich eine Variable als char deffinier ist das dan beim AVR GCC
defaultmäßig eine unsigned char Variable?

also:

unsigned char test = chr test != signed char test ?

Danke schon mal vorab, Jochen

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das sollte in der Compilerdokumentation drinstehen.
Zumindest bei anderen Compilern gibt es dafür auch eine Compileroption,
mit der man das einstellen kann.

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schau mal in deine makefile...


<<<<<<<snip>>>>>>>>>
 Optional compiler flags.
#  -g:        generate debugging information (for GDB, or for COFF
conversion)
#  -O*:       optimization level
#  -f...:     tuning, see gcc manual and avr-libc documentation
#  -Wall...:  warning level
#  -Wa,...:   tell GCC to pass this to the assembler.
#    -ahlms:  create assembler listing
CFLAGS = -g -O$(OPT) \
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums \
-Wall -Wstrict-prototypes \
-Wa,-adhlns=$(<:.c=.lst) \
<<<<<<<snip>>>>>>>>>

und jetzt ein kleiner blick in die gcc-doku...
http://gcc.gnu.org/onlinedocs/gcc-3.4.1/gcc/C-Dial...

<<<<<<<<snip
-funsigned-char
Let the type char be unsigned, like unsigned char.
Each kind of machine has a default for what char should be. It is
either like unsigned char by default or like signed char by default.

Ideally, a portable program should always use signed char or unsigned
char when it depends on the signedness of an object. But many programs
have been written to use plain char and expect it to be signed, or
expect it to be unsigned, depending on the machines they were written
for. This option, and its inverse, let you make such a program work
with the opposite default.

The type char is always a distinct type from each of signed char or
unsigned char, even though its behavior is always just like one of
those two.


-fsigned-char
Let the type char be signed, like signed char.
Note that this is equivalent to -fno-unsigned-char, which is the
negative form of -funsigned-char. Likewise, the option -fno-signed-char
is equivalent to -funsigned-char.
<<<<<<<<<snip>>>>>>>>>

73 de oe6jwf / hans

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich denke, ohne Option ist es ein signed char -- aber s. o., darauf
verlassen sollte man sich ohnehin nicht.

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das tolle an der zitierten gcc-Dokumentation ist, daß die mit keinem
Wort darauf eingeht, wie char nun behandelt wird, wenn keine der
genannten Optionen gesetzt wird; was also mag der _default_-Wert sein?

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Er ist architekturabhängig.

Autor: Jochen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay,

danke. In meinem Makefile ist die Option -funsigned-char gesetzt.

Danke für Eure Hilfe
Jochen

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Er ist architekturabhängig.

Aha. Gibt es Hinweise, die einen darauf schließen lassen könnten,
welche Architektur welche Variante bevorzugt?

Kann man denn den Compiler fragen, was er mag?

  gcc -dumpspecs

erwähnt jedenfalls auf meinem System (gcc 3.4.2 für ARM) nichts
derartiges.

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich wüßte es im Moment nicht, wie man es herausfindet...

Autor: Sven A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da diese ganze signed char unsigned char geschichte oft unterschiedlich
gehandhabt wird, habe ich mir angewöhnt die Variabeln bei der
deklaration direkt als unsigned char bzw. signed char zu deklarieren.
Damit bin ich dann immer sicher und weiß um welchen Typen von char es
sich bei meiner Variable x handelt.

Autor: Paul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nur aus Interesse: Wofür, wenn nicht bei contests, bei denen es auf
Tokenanzahl ankommt, muss man wissen, ob char signed oder unsigned
ist?

Portabel wird so ein Code kaum werden.

Autor: Jochen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
naja,

ich lese Z.B. eine DS1631 aus. Der Liefert mir halt jeweil 1 Byte und
je  nach dem ob es klat oder war ist eben + oder - Grad.
Und ich denke schon das es dann sinnvoll ist ein signed char zu
verwenden ;-)

Grüßle Jochen

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum willst du ein signed char verwenden?  Was tust du, wenn dein
Code an eine Architektur gerät, bei der sizeof(char) == 4 ist?  (Sowas
soll's geben, zum Bleistift irgendwelche DSPs, die nur 32-bit Integer
können.)

Du willst stattdessen

#include <stdint.h>

...
int8_t mytempval;

benutzen.  Wenn du dann an eine Architektur gerätst, die keine
8-Bit-Werte unterstützt, gibt's einen Compiler-Fehler.  In allen
anderen Fällen darfst du dich drauf verlassen, dass "mytempval" ein
vorzeichenbehafteter 8-bit-Integerwert ist.

Autor: Jochen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja,

man lernt ja nie aus ;-)
Werd ich mir mal anschauen, danke.

Gruß Jochen

Autor: Christian Rötzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit folgender Sequenz kann man natürlich schon rausfinden, ob der char
nun signed oder unsigned ist:

char c = 0xC0;
printf("%d",(int)c);

Wenn als Ergebnis 192 da steht, war's unsigned, bei -64 ist's ein
signed char. Und genau solche Zuweisungen führen natürlich zu
Problemen. Ich kann mich insofern nur obiger Meinung anschließen sowas
explizit anzugeben.

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.