Frage

In C / C ++, was für ein unsigned char angewandt? Wie unterscheidet es sich von einem regulären char?

War es hilfreich?

Lösung

In C ++ gibt es drei verschieden Zeichentypen:

  • char
  • signed char
  • unsigned char

Wenn Sie Zeichentypen verwenden für text , verwenden Sie den uneingeschränkten char:

  • es ist die Art von Zeichenliterale wie 'a' oder '0'.
  • es ist die Art, die C-Strings wie "abcde" macht

Es funktioniert auch als Zahlenwert, aber es ist nicht spezifiziert, ob dieser Wert als mit oder ohne Vorzeichen behandelt wird. Hüten Sie sich vor Zeichenvergleiche durch Ungleichheiten -. Obwohl, wenn Sie sich auf ASCII begrenzen (0-127) Sie fast sicher sind

Wenn Sie Zeichentypen verwenden als Zahlen , verwenden Sie:

  • signed char, die Sie mindestens der -127 bis 127 Bereich gibt. (-128 bis 127 ist üblich)
  • unsigned char, die Sie gibt mindestens die 0 bis 255 Bereich.

„Wenigstens“, weil die C ++ Standard gibt nur den minimalen Bereich von Werten, die jeder numerischer Typ erforderlich ist, abzudecken. sizeof (char) erforderlich ist 1 (d.h. ein Byte) sein, aber ein Byte in der Theorie beispielsweise 32 Bits sein könnte. sizeof wäre noch seine Größe berichten als 1 -. Was bedeutet, dass Sie könnte haben sizeof (char) == sizeof (long) == 1

Andere Tipps

Dies ist abhängig Implementierung, da die C-Norm die signierten-ness von char nicht definiert. Je nach Plattform, Saibling kann signed oder unsigned werden, so müssen Sie für signed char oder unsigned char ausdrücklich fragen, ob Ihre Implementierung davon abhängt. verwenden char nur, wenn Sie beabsichtigen Zeichen von Zeichenketten darstellen, da dies dem entsprechen, was Ihre Plattform in der Zeichenfolge setzt.

Der Unterschied zwischen signed char und unsigned char ist als man erwarten würde. Auf den meisten Plattformen signed char wird eine 8-Bit-Zweier-Komplement-Zahl im Bereich von -128 127 und unsigned char wird ein 8-bit unsigned integer (0 bis 255) sein. Beachten Sie den Standard erfordert nicht, dass char Arten 8 Bits haben, nur dass sizeof(char) Rückkehr 1. Sie können an der Anzahl von Bits in einem Zeichen mit CHAR_BIT in limits.h bekommen. Es gibt nur wenige, wenn irgendwelche Plattformen heute, wo dies etwas anderes als 8 sein wird, aber.

Es gibt eine schöne Zusammenfassung dieser Ausgabe hier .

Wie andere erwähnt haben, da ich dies geschrieben, du bist besser dran int8_t und uint8_t verwenden, wenn Sie wirklich darstellen wollen kleine ganze Zahlen sind.

Weil ich finde, dass es wirklich gefordert, ich möchte nur einige Regeln von C und C ++ erklären (sie sind gleich in dieser Hinsicht). Zuerst alle Bits von unsigned char Teilnahme an den Wert, wenn ein unsigned char-Objekt zu bestimmen. Zweitens wird unsigned char explizit unsigned angegeben.

Nun, ich hatte ein Gespräch mit jemandem über das, was passiert, wenn man den Wert -1 vom Typ int konvertieren unsigned char. Er weigerte sich, die Idee, dass die resultierende unsigned char seine Bits alle auf 1 gesetzt hat, weil er Zeichen Darstellung besorgt war. Aber er nicht haben. Es ist unmittelbar nach aus dieser Regel, dass die Umwandlung tut, was beabsichtigt ist:

  

Wenn der neue Typ unsigned ist, wird der Wert durch wiederholtes Hinzufügen umgewandelt oder   eine mehr als der Maximalwert subtrahiert wird, die in dem neuen Typ dargestellt werden können,   bis der Wert im Bereich des neuen Typs. (6.3.1.3p2 in einem C99-Entwurf)

Das ist eine mathematische Beschreibung. C ++ beschreibt es in Bezug auf die Modulo-Kalkül, die auf die gleiche Regel ergibt. Wie auch immer, was ist nicht garantiert ist, dass alle Bits in dem ganzzahligen -1 sind eine vor der Umwandlung. Also, was haben wir denn so können wir behaupten, dass die resultierende unsigned char seine CHAR_BIT Bits alle gedreht hat bis 1?

  1. teilnehmen Alle Bits seinen Wert bei der Bestimmung - das heißt, treten keine Füllbits im Objekt.
  2. nur einmal UCHAR_MAX+1 Hinzufügen Wert in Bereich nachgeben zu -1, nämlich UCHAR_MAX

Das ist genug, tatsächlich! Also, wenn Sie wollen eine unsigned char haben alle eine seiner Bits, die Sie tun

unsigned char c = (unsigned char)-1;

Es folgt auch, dass eine Umwandlung ist nicht nur Bits höherer Ordnung abgeschnitten. Das glückliche Ereignis für Zweier-Komplement ist, dass es dort nur eine Verkürzung ist, aber das gleiche gilt nicht unbedingt für andere Zeichen Darstellungen.

Wie zum Beispiel Verwendungen von unsigned char :

unsigned char häufig in der Computergrafik verwendet wird, die sehr oft (aber nicht immer) ein einziges Byte zu jeder Farbkomponente zuweist. Es ist üblich, eine RGB (oder RGBA) Farbe als 24 (oder 32) Bits, die jeweils ein unsigned char vertreten zu sehen. Da unsigned char Werte fallen in den Bereich [0255] werden die Werte typischerweise interpretiert als:

  • 0 bedeutet einen völligen Mangel an einer bestimmten Farbkomponente.
  • 255 100% eines gegebenen Farbpigment Bedeutung.

So können Sie mit RGB würden am Ende rot wie (255,0,0). -> (100% rot, 0% grün, 0% blau)

Warum nicht ein signed char ? Arithmetische und Bitverschiebung wird problematisch. Wie bereits erläutert, unterzeichnet ein char 's-Bereich im Wesentlichen von -128 verschoben wird. Eine sehr einfache und naive (meist ungenutzt) Verfahren für RGB in Graustufen Umwandlung ist es, alle drei Farbkomponenten mitteln, aber dies führt zu Problemen, wenn die Werte der Farbkomponenten negativ sind. Rot (255, 0, 0) betragen bis (85, 85, 85) bei der Verwendung von unsigned char Arithmetik. wenn die Werte waren jedoch signed char s (127, -128, -128), würden wir am Ende mit (-99, -99, -99), das wäre (29, 29, 29) in unserem unsigned char Raum, die nicht korrekt ist.

Wenn Sie einen Charakter als eine kleine ganze Zahl verwenden, die sicherste Art und Weise zu tun, ist es mit den int8_tand uint8_t Typen.

signed char hat -128 bis 127 liegen; unsigned char hat Bereich 0 bis 255.

char wird gleichwertig sein entweder signed char oder unsigned char, je nach Compiler, ist aber eine deutliche Art.

Wenn Sie C-Strings verwenden, nur char verwenden. Wenn Sie arithmetische Zeichen verwenden müssen (ziemlich selten), gibt mit oder ohne Vorzeichen explizit für die Portabilität.

char und unsigned char sind nicht als 8-Bit-Typen auf allen Plattformen-sie garantiert sind garantiert 8-Bit oder größer sein. Einige Plattformen haben 9-Bit, 32-Bit oder 64-Bit-Bytes . Allerdings sind die meisten gängigen Plattformen heute (Windows, Mac, Linux x86, etc.) haben 8-Bit-Bytes.

Im Hinblick auf den direkten Werten ein reguläres Zeichen verwendet wird, wenn die Werte bekannt sind zwischen CHAR_MIN und CHAR_MAX zu sein, während ein unsigned char doppelten Reichweite am positiven Ende bietet. Zum Beispiel, wenn CHAR_BIT 8 ist, wird der Bereich des regelmäßigen char nur sein garantiert [0, 127] (weil es mit oder ohne Vorzeichen werden kann), während unsigned char sein [0, 255] und signed char wird [-127, 127 ].

Im Hinblick darauf, was es für verwendet wird, erlauben die Standards Objekte von POD (plain old-Daten) direkt auf ein Array von unsigned char umgewandelt werden. Dadurch können Sie die Darstellung und Bitmuster des Objekts untersuchen. Die gleiche Garantie für sichere Art punning existiert nicht für char oder signed char.

unsigned char nimmt nur positive Werte .... wie 0 255

Dabei gilt als

signed char nimmt sowohl positive als auch negative Werte .... wie -128 +127

Ein unsigned char ist ein (unsigned) Byte-Wert (0 bis 255). Sie können in Bezug auf die „char“ denken, der ein „Zeichen“ zu sein, aber es ist wirklich ein numerischer Wert. Das reguläre „char“ signiert ist, so dass Sie 128 Werte haben, und diese Werte abbilden zu Zeichen ASCII-Codierung. Aber in jedem Fall, was Sie im Speicher zu speichern ist ein Byte-Wert.

Wenn Sie verschiedene Arten von bestimmten Länge und Signedness gerne verwenden, sind Sie wahrscheinlich besser dran mit uint8_t, int8_t, uint16_t, etc, nur weil sie genau das, was sie sagen.

Ein unsigned char verwendet das Bit, das für das Zeichen eines regulären Zeichen als eine andere Nummer reserviert ist. Dadurch ändert sich der Bereich auf [0 - 255] im Gegensatz zu [-128 - 127].

Im Allgemeinen unsigned Zeichen verwendet werden, wenn Sie keine Zeichen wollen. Dies wird einen Unterschied machen, wenn Dinge wie Verschieben von Bits (Verschiebung erweitert das Vorzeichen) und andere Dinge zu tun, wenn sie als einen Byte anstatt es als eine Zahl mit einem Zeichen zu tun.

unsigned char ist das Herz aller Bit-Tricks. In fast allen Compiler für alle Plattformen ein unsigned char ist einfach ein BYTE. Eine vorzeichenlose ganze Zahl von (in der Regel) 8 Bits. das kann als eine kleine ganze Zahl oder eine Packung von Bits behandelt werden.

In Sucht, wie jemand anderes gesagt hat, ist der Standard nicht das Zeichen eines char definieren. so haben Sie 3 verschiedene "char" Typen: char, signed char, unsigned char

.

Einige googeln dieser , wo die Menschen eine Diskussion darüber hatte.

Ein unsigned char ist im Grunde ein einziges Byte. Also, würden Sie diese verwenden, wenn Sie ein Byte Daten benötigen (zB vielleicht möchten Sie es verwenden setzen Flaggen auf und ab an eine Funktion übergeben werden, wie es oft in der Windows-API durchgeführt wird).

zitierte frome "die C-Programmierung laugage" Buch:

Die Qualifier signed oder unsigned kann verkohlen oder eine ganze Zahl angewendet werden. Zahlen ohne Vorzeichen sind immer positiv oder Null ist, und die Gesetze der Arithmetik Modulo 2 ^ n gehorchen, wobei n die Zahl von Bits in der Art. So zum Beispiel, wenn Zeichen 8 Bits sind, unsigned char Variablen Werte zwischen 0 und 255, während signierten Zeichen haben Werte zwischen -128 und 127 (in einem zwei‘s Maschine ergänzen.) Ob Klar Zeichen signiert sind oder nicht signiert ist maschinenabhängig, aber druckbare Zeichen sind immer positiv.

unsigned char nimmt nur positive Werte: 0 bis 255 signed char nimmt positive und negative Werte: -128 bis +127

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