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?

War es hilfreich?

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 Werte 0 oder SCHAR_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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top