Mailinglist Archive: opensuse-programming-de (153 mails)

< Previous Next >
Re: unsigned char Was ist das?
  • From: Daniel Feist <clusterix.perl@xxxxxx>
  • Date: Wed, 20 Aug 2003 11:01:57 +0200 (CEST)
  • Message-id: <Pine.LNX.4.53.0308201044370.1408@xxxxxxxxxxx>
On Wed, 20 Aug 2003, Thorsten Haude wrote:

> Moin,
>
> * Daniel Feist <clusterix.perl@xxxxxx> [2003-08-18 10:12]:
> >Normalerweise hat ja char einen Wertebereich zwischen minus 127 und plus
> >128 - dieser Bereich wird auch 'signed char' gennant. 'char' wird
> >automatisch als 'signed char' betrachtet bzw. 'char' oder 'signed char'
> >ist das gleiche.
>
> Das gilt nur für die anderen Ganzzahlentypen. Der Wertebereich von
> 'char' ist vom Compilerbauer frei wählbar und kann 'signed char',
> 'unsigned char' oder wie ich gerade lese eine Mischform sein.
>
> "Mischform?" fragt Ihr Euch jetzt:
> Type char may be a "pseudo-unsigned" integral type - that is, it
> can contain only nonnegative values, but it is treated as if it
> were a signed type when performing the usual unary conversions.
>
> (Samuel P. Harbison, Guy L. Steele: C: A Reference Manual)
>
>
> >Jetzt gibt es aber auch noch eine Möglichkeit, den Wertebereich von
> >char zu erweitern - das geht mit 'unsigned char'.
>
> s/erweitern/verschieben/

Hallo Thorsten,
Genau so ist das - es ist ja so, dass da mit signed und unsigned nicht nur
bei char so ist, sodern auch bei anderen - hier eine kleine Tabelle:

char, signed char 1 Byte == 8 Bit -128 +127

unsigned char 1 Byte == 8 Bit 0 255

short, signed short 2 Byte == 16 Bit -32768 +32767

unsigned short 2 Byte == 16 Bit 0 65535

int, signed int 4 Byte == 32 Bit -2147483648 +2147483648

unsigned int 4 Byte == 32 Bit 0 4294967295

long, signed long 4 Byte == 32 Bit -2147483648 +2147483648

unsigned long 4 Byte == 32 Bit 0 4294967295


Hier ein simples Programmbeispiel:

#include <stdio.h>

int main()
{
char a = "A";
char b = 65;
int c = 65;
int d;

printf("a = %c\n", a);
printf("a = %c\n", b); /*Überrascht?*/
printf("c = %c\n", c);

d = a + b + c;
printf("d = %d\n");

d = 'a' + 'A';
printf("d = %d\n", d);

printf("char a = %c und %d\n",a,a);
printf("char b = %c und %d\n",b,b);
printf("int c = %c und %d\n",c,c);
return 0;

}

Warum wird bei den ersten printf-Ausgaben nicht die Zahl 65 ausgegeben?
Ganz einfach zu erklären - in der ASCII-Tabelle ist die Zahl 65 = A.
Wichtig ist, dass der richtige Datentyp mit %c dem Compiler richtig gesagt
wird - dann weiß dieser, dass er die ASCII-Tabelle nehmen soll - hätte man
eben %d genommen, wäre 65 richtig ausgegen worden.

Ich hoffe, ich konnte einen kleinen Überblick über die möglichen
Datentypen in C geben, bei denen mit signed oder unsigned gearbeitet
werden kann.

> >> --
> >> Um die Liste abzubestellen, schicken Sie eine Mail an:
> >> suse-programming-unsubscribe@xxxxxxxx
> >> Um eine Liste aller verfügbaren Kommandos zu bekommen, schicken
> >> Sie eine Mail an: suse-programming-help@xxxxxxxx
>
> Einfach löschen, was Du nicht mehr brauchst.
>
>
> Thorsten
> --
> It is exactly because markets are amoral that we cannot
> leave the allocation of resources entirely to them.
> - George Soros
>

Gruß,
Daniel
--
Daniel Feist (clusterix.perl@xxxxxx)

< Previous Next >