[C] ASCII-Character größer als 127 dezimal

Gobble-G

Lieutenant
Registriert
Nov. 2002
Beiträge
727
Hallo,

ich habe da folgendes Problem. Ich will ein 'ü' mit printf ausgeben:

printf("%c",'ü');

Die Ausgabe ist eine ³ (in Worten: hoch drei). Ich habe auch schon versucht, das Ganze über (char) und/oder (unsigned char) zu casten, was aber keinen Erfolg brachte.

Das Problem liegt vermutlich darin, daß (char) auf 8 Bit arbeitet und somit Dezimalzahlen von -128 bis 127 entspricht. Darum dachte ich, daß ich mit (unsigned char) was drehen könnte, um auf Basis von 0 bis 255 arbeiten zu können.

Die Eingabe 'ü' scheint aber ein normales (char) zu sein. Kann ich die Eingabe 'ü' irgendwie anders gestalten, so daß es ein (unsigned char) ist? (Casten danach bringt's nicht...)

Ich wäre froh, wenn mir jemand helfen könnte....

Gruß, Gobble-G
 
Das Problem liegt vermutlich darin, daß (char) auf 8 Bit arbeitet und somit Dezimalzahlen von -128 bis 127 entspricht

ähm, 8 bit geht also von -128 bis +127 - das wäre mir neu. das ist eine mögliche interpretation des zahlenbereiches. mit 8bit kann man 256 verschiedene zustände speichern. ausserdem ist der asci und ascii zeichensatz unsigniert und selbst wenn, würde das keine rolle spielen.
 
Zuletzt bearbeitet:
Klar kann man den Bereich verschieben, in dem gearbeitet werden soll. Bei integer bspw. kann man mit unsigned nur den positiven Bereich verwenden. Der ist dann aber doppelt so groß.

Außerdem hab' ich das Problem in C (siehe Betreff) und nicht in PHP.
 
ups :)

ich schätzte mal aber das wird nicht gross anders sein da php ja auf c basiert (mehr oder weniger)


aber noch mal zu den bits. es ist NUR interpretationssache, du könntest auch festlegen, dass das bit 2^0 für die positive anzeige eines integerwertes verantwortlich ist, müsstest dann aber deine hardware unter umständen anders bauen oder aber die cpu alles umrechnen lassen (ist also mehr theoretisch)
 
Zuletzt bearbeitet:
Komisch. Prinzipiell sollte das nämlich schon so funktionieren, wie du es beschrieben hast. Ich hab das mal ausprobiert und bei mir (mit einem gcc-Compiler) funktioniert es auch einwandfrei (sowohl mit expliziten casten als auch ohne casten).
 
@ag3nt: OK, wo kann ich da (in C) was festlegen?

@ShinziLord: Hm, ich hab' hier das VS C++ 6.0 Autorenedition mit SP5 und nutze auch das GLUT. Ich werd' das bei Gelegenheit mal mit dem gcc probieren.
 
in c ? k.a.

sry hab mich mit c noch nicht auseinandergesetzt, aber das ascii zeichen ist bestimmt nicht segniert (besteht ja auch kein grund dazu oder sind dann zeichen umgedreht ? ;) z.B.: ? ¿ ), das würde mich echt wundern
 
Original erstellt von ag3nt
in c ? k.a.

sry hab mich mit c noch nicht auseinandergesetzt, aber das ascii zeichen ist bestimmt nicht segniert (besteht ja auch kein grund dazu oder sind dann zeichen umgedreht ? ;) z.B.: ? ¿ ), das würde mich echt wundern

Ich meinte ja auch nur, daß es zu 0 bis 255 ein zugehöriges ASCII-Zeichen gibt. Umgekehrt kann ich zu jedem ASCII-Zeichen eine Dezimalzahl zwischen 0 und 255 zuordnen. Der Datentyp char (8 Bit) ist ein Ganzzahltyp, der Werte zwischen -128 und 127 annehmen kann. D.h. 134 bspw. wäre nicht definiert.
Um jetzt Zahlen zwischen 0 und 255 zu verwenden, benutzt man das sonstige Vorzeichenbit, um den Zahlenbereich zu verschieben. Mit unsigned char definierst Du so einen Zahlenbereich zwischen 0 und 255.

Zum Problem: Wenn ich ein 'ü' eingebe und statt 129 eine -4 bekomme, ist das Asche.
 
ok, lassen wa das mit den signbits und so sein, ich denk du weisst genauso gut wie ich wie das funktioniert / funktionieren sollte, nur warum der dir eine negative zahl ausspuckt find ich doch etwas seltsam. hast du dir mal testhalber den hexwert ausgeben lassen ?
 
@ag3nt: Sag' mir bitte, wie das geht!

@ShinziLord: So, ich habe jetzt auch 'nen gcc-Compiler ausprobiert. Das Ergebnis ist leider dasselbe. So sieht das Testprogramm aus:
Code:
int main(int argc, char **argv)
{
        printf("%c ",'ü');
}
Die Ausgabe ist wieder ein ³ (hoch drei). Ich bin am Verzweifeln...
 
Zuletzt bearbeitet:
Tut mir leid, da werde ich dir nicht helfen können. Ich habe jetzt dein Testprogramm unter 3 verschiedenen Systemen (Windows, Linux, Unix) mit drei unterschiedlichen Versionen von gcc getestet und bei mir kommt immer das 'ü' als Ausgabe.
 
Es gibt da eine Funktion in der API für:

Code:
#include "stdafx.h"
#include <stdio.h>
#include <windows.h>

int _tmain(int argc, _TCHAR* argv[])
{
       char * test=new char[2];
	
       CharToOem("ü",test);

       printf("%s",test);
       scanf(test);

       delete test;
       return 0;
}

Also: windows.h inkludieren und mit CharToOem() arbeiten.
 
Zuletzt bearbeitet:
@Herbert2221: So funktioniert es. Caste ich test[0] (also 'ü') in Integer, erhalte ich -127. Deklariere ich test nicht als char sondern als unsigned char, bekomme ich die gewünschte 129.
So sollte das sein. DANKE!

Jetzt würde mich nur kurz interessieren, was da genau passiert. Was ist der OME-defined character set?
 
Windows verwendet in Konsolen-Fenstern automatisch den ASCII Zeichensatz. Da Windows normalerweise den ANSI Zeichensatz verwendet muss man hier konvertieren. Das eben macht diese Funktion.
 
Nur mal eine kleine Anmerkung zu: das Zeichen 134 wäre dann nicht definiert...

Auf Bit-Ebene ist das dem Computer völlig egal.

134 sind binär 10000110

aber auch -122 sind binär 10000110. (auf 8-Bit Ebene)

-122 wiederum ist im gültigen Bereich von -128 bis 127 und somit die signed Repräsentation für 134.

Letztendlich weiß der Prozessor garnicht, ob du 134 oder -122 meinst, er gibt einfach den Wert 1000110 aus. Alles andere ist Darstellungssache.
 
Zurück
Oben