Ist char unterzeichnet oder standardmäßig unsigned?
Frage
In dem Buch "Complete Reference von C" erwähnt wird, dass char
standardmäßig nicht signiert ist.
Aber ich versuche, das so gut wie Visual Studio mit GCC zu überprüfen. Es nimmt es als unterzeichnet standardmäßig aktiviert.
Welches ist richtig?
Lösung
Das Buch ist falsch. Die Norm legt nicht auf, wenn Ebene char
signiert oder unsigniert.
In der Tat, der Standard definiert drei verschiedene Arten: char
, signed char
und unsigned char
. Wenn Sie #include <limits.h>
und dann bei CHAR_MIN
anschaut, kann man herausfinden, ob schlicht char
signed
oder unsigned
ist (wenn CHAR_MIN
kleiner als 0 oder gleich 0), aber selbst dann die drei Typen unterscheiden als Was den Standard betrifft.
Zu beachten ist, dass char
auf diese Weise besonders ist. Wenn Sie eine Variable als int
erklären ist es 100% entspricht es als signed int
zu erklären. Dies ist immer dann gilt für alle Compiler und Architekturen.
Andere Tipps
Wie Alok Punkte aus , die Standard-Blättern, dass bis zur Umsetzung.
Für gcc, wird der Standard unterzeichnet, aber Sie können das ändern mit -funsigned-char
. Hinweis: für gcc in Android NDK, die Standardeinstellung ist unsigned . Sie können auch mit -fsigned-char
.
Auf MSVC, das Standard signiert ist, aber Sie können das ändern mit /J
.
C99 N1256 Entwurf 6.2.5 / 15 „Typ“ hat dies über die signierten-ness vom Typ char
zu sagen:
Die Umsetzung soll char definiert den gleichen Bereich haben, Darstellung und Verhalten entweder als signed char oder unsigned char.
und in einer Fußnote:
CHAR_MIN
, in<limits.h>
definiert ist, wird einer der Werte0
oderSCHAR_MIN
haben, und dies kann verwendet werden, die zwei Möglichkeiten zu unterscheiden. Unabhängig von der Wahl getroffen,char
ist eine separate Art von den beiden anderen und ist nicht kompatibel mit entweder.
Nach der Programmiersprache C Buch von Dennis Ritchie, die die de-facto-Standard Buch für ANSI C ist, entweder schlicht Zeichen mit oder ohne Vorzeichen sind maschinenabhängig, aber druckbare Zeichen sind immer positiv.
Nach dem C-Standard des Signedness plain char "Implementierung definiert."
Generell Implementierer wählte je nachdem, was effizienter war auf ihrer Architektur zu implementieren. Auf x86-Systemen char ist in der Regel unterzeichnet. Auf Armsystemen ist es im Allgemeinen unsigned (Apple iOS ist eine Ausnahme).
Laut "The C ++ Programming Language" von Bjarne Stroustrup, char
ist "Implementierung definiert". Es kann signed char
oder unsigned char
je nach Implementierung sein. Sie können prüfen, ob char
signiert ist oder nicht durch std::numeric_limits<char>::is_signed
verwendet wird.
Nun, bekannt wir die Standard-Blätter, die zur Umsetzung auf.
Aber wie eine Art zu überprüfen, ist signed
oder unsigned
, wie char
?
Ich schrieb einen Makro, dies zu tun:
#define IS_UNSIGNED(t) ((t)~1 > 0)
und testen Sie es mit gcc
, clang
und cl
. Aber ich nicht sicher, dass es immer sicher für andere Fälle.