char, signed char
-
Hallo,
Ich arbeite grade etwas mit C++ (komme ursprünglich von C bzw. C89). Nun folgende Frage:
Wieso ist char ungleich signed char? Ist das eine Eigenheit von C++ oder C99? Was ist zu beachten? Ist hier ein Cast (signed char <-> char) erlaubt?Gruß
-
In C++ zumindest ist nicht definiert ob 'char' signed oder unsigned ist. Oder irre ich mich da?
-
Laut google gibt es bei c++ wirklich drei Typen von char:
char, unsigned char, signed charIst aber der einzige Typ, wo signed ungleich "keine Angabe" ist (normalerweise keine Angabe -> signed).
Nun nochmal meine Fragen:
- Inwiefern unterscheidet sich nun char von signed char
- seit wann gibts diese Unterscheidung? (C99? C++? Oder gabs das auch schon bei C89?)
- Darf man signed char <-> char bedenkenlos casten?Gruß
-
es gibt nur 2, signed char und unsigned char.
wenn man nix davorschreibt (also nur 'char') ist es implementationsspezifisch, ob 'signed' oder 'unsigned' genommen wird.
signed char ist immer vorzeichenbehaftet, die eine hälfte des wertebereichs ist negativ.
unsigned char kann nur positive werte, dafür aber doppelt so viele wie 'signed'.

-
bin mir nicht 100%ig sicher ... aber sollte laut std. signed sein.
-
Hallo,
Konnte ich leider nicht nachvollziehen:
void testFunction (const char* textPointer); const char text1[]=("Text1"); const signed text2[]=("Text2"); const unsigned char text3[]=("Text3"); testFunction (text1); // compiliert problemlos testFunction (text2); // invalid conversion ... testFunction (text3); // invalid conversion ...Getestet mit g++ unter Ubuntu.
Müsste denn dann nicht test2 oder text3 ohne Fehlermeldung compilieren wenn char = unsigned char bzw. char = signed char?
-
soll natürlich
const signed charheißen...
-
Plain char, signed char, and unsigned char are three distinct types. A char, a signed char, and an unsigned char occupy the same amount of storage and have the same alignment requirements (3.9); that is, they have the same object representation. For character types, all bits of the object representation participate in the value representation. For unsigned character types, all possible bit patterns of the value representation represent numbers. These requirements do not hold for other types.
In any particular implementation, a plain char object can take on either the same values as a signed char or an unsigned char; which one is implementationdefined.
-
c++ Newbie schrieb:
Müsste denn dann nicht test2 oder text3 ohne Fehlermeldung compilieren wenn char = unsigned char bzw. char = signed char?
Ja müsste. Es gibt entgegen anderslautendem Halbwissen in diesem Thread tatsächlich 3 verschiedene char-Typen. Warum das so ist, das kann ich dir allerdings auch nicht beantworten

-
Bashar schrieb:
Es gibt entgegen anderslautendem Halbwissen in diesem Thread tatsächlich 3 verschiedene char-Typen.
welcher ist denn der dritte typ?
'half-signed' ?
-
vista schrieb:
welcher ist denn der dritte typ?
char.
Hast den Rest des Threads wohl nicht gelesen
-
MFK schrieb:
vista schrieb:
welcher ist denn der dritte typ?
char.
Hast den Rest des Threads wohl nicht gelesen
doch, aber das funktioniert ungefähr so:
man hat die wahl zwischen 'char', 'signed char' und 'unsigned char'.
d.h. man kann sich für eine von 3 möglichkeiten entscheiden,
signed char -> ist garantiert signed
unsigned char -> ist garantiert unsigned
char -> ist entweder das eine oder das andere
- aber -
es gibt nur 2 char-typen, bei 'nur char' lässt man dem compiler die wahl, das ist der einzige unterschied, kein 'teilweise sigend' oder sowas...

-
vista schrieb:
doch, aber das funktioniert ungefähr so:[...]
char -> ist entweder das eine oder das andereNein, char hat entweder den Wertebereich von signed oder von unsigned char, ist aber immer ein eigenständiger Typ. Es wurde dazu auch schon alles gesagt, inklusive Code-Beispiel und Zitat aus dem Standard, was willst du noch?
-
Bashar schrieb:
Nein, char hat entweder den Wertebereich von signed oder von unsigned char, ist aber immer ein eigenständiger Typ.
stimmt, so gesehen hast du natürlich recht (ich hatte das codebeispiel übersehen).
ist das in C etwa auch so oder ist das eine C++ spezialität?
-
Ist in C genauso
meinten jedenfalls dir Gurus in der Linux kernel mailinglist
-
Es dürfte aber in C etwas weniger Probleme damit geben.
-
Hm und wie geht man mit char am besten um? Bleibt einem dann nur übrig auch char zu verwenden? Oder einfach casten? Viele Bibliotheksfunktion verwenden ja nur char (kein signed oder unsigned char).
Grund der Frage: verwende gerne die uintX_t und intX_t typedefs von gcc bzw. g++. Da hab ich leider kein char und wollte jetzt auch net unbedingt char verwenden