In dem Buch "Complete Reference of C" wird erwähnt, dass char
es standardmäßig nicht signiert ist.
Ich versuche dies jedoch sowohl mit GCC als auch mit Visual Studio zu überprüfen. Es wird standardmäßig als signiert angenommen .
Welches ist korrekt?
char
vorzeichenlos sein kann, verwenden Sie als Faustregel aint
, um einen Wert mit zu lesengetchar()
, der möglicherweise zurückgegeben wirdEOF
.EOF
wird normalerweise als-1
oder als anderer negativer Wert definiert, dessen Speicherung in einemunsigned
nicht das ist, was Sie wollen. Hier ist die Erklärung:extern int getchar();
Übrigens, diese Empfehlung stammt auch aus dem Buch "C: A Reference Manual".char
Fall müssten Sieint
den Rückgabewert speichern.Antworten:
Das Buch ist falsch. Der Standard gibt nicht an, ob Plain
char
signiert oder nicht signiert ist.Tatsächlich definiert die Norm drei verschiedene Arten:
char
,signed char
, undunsigned char
. Wenn Sie#include <limits.h>
und dann schauenCHAR_MIN
, können Sie herausfinden, ob Plainchar
istsigned
oderunsigned
(wennCHAR_MIN
kleiner als 0 oder gleich 0 ist), aber selbst dann unterscheiden sich die drei Typen in Bezug auf den Standard.Beachten Sie, dass
char
dies auf diese Weise etwas Besonderes ist. Wenn Sie eine Variable deklarieren,int
entspricht dies zu 100% der Deklaration alssigned int
. Dies gilt immer für alle Compiler und Architekturen.quelle
int
bedeutetsigned int
immer, oder? Abgesehen davonchar
, in welchen anderen Datentypen gibt es die gleiche VerwirrungC
?char
ist der einzige Typ, der signiert oder nicht signiert werden kann.int
ist zumsigned int
Beispiel äquivalent zu .int
signiert oder nicht signiert ist.Wie Alok betont , überlässt der Standard dies der Implementierung.
Für gcc ist die Standardeinstellung signiert, aber Sie können dies mit ändern
-funsigned-char
. Hinweis: Für gcc in Android NDK ist die Standardeinstellung nicht signiert . Sie können auch explizit nach signierten Zeichen mit fragen-fsigned-char
.In MSVC ist die Standardeinstellung signiert, aber Sie können dies mit ändern
/J
.quelle
C99 N1256 Entwurf 6.2.5 / 15 "Typen" hat Folgendes über die Signatur des Typs zu sagen
char
:und in einer Fußnote:
quelle
Laut dem Buch The C Programming Language von Dennis Ritchie, dem De-facto-Standardbuch für ANSI C, sind Zeichen mit oder ohne Vorzeichen maschinenabhängig, aber druckbare Zeichen sind immer positiv.
quelle
Gemäß dem C-Standard ist die Signatur von normalem Zeichen "Implementierung definiert".
Im Allgemeinen wählten die Implementierer diejenige, die für die Implementierung in ihrer Architektur effizienter war. Auf x86-Systemen ist char im Allgemeinen signiert. Auf Arm-Systemen ist es im Allgemeinen nicht signiert (Apple iOS ist eine Ausnahme).
quelle
Laut "The C ++ Programming Language" von Bjarne Stroustrup
char
ist "Implementierung definiert". Dies kannsigned char
oderunsigned char
hängt von der Implementierung ab. Mit können Sie überprüfen, obchar
signiert ist oder nichtstd::numeric_limits<char>::is_signed
.quelle
Jetzt wissen wir, dass der Standard dies der Implementierung überlässt.
Aber wie Sie zu überprüfen , ein Typ ist
signed
oderunsigned
wiechar
?Ich habe dazu ein Makro geschrieben:
#define IS_UNSIGNED(t) ((t)~1 > 0)
und testen Sie es mit
gcc
,clang
undcl
. Aber ich bin mir nicht sicher, ob es für andere Fälle immer sicher ist.quelle