wie bekommt man die ASCII-Zahlen von Zeichen ?
-
Geht das umgekehrt auch?
Etwa so:
char c=i ;
-
sicher
-
der Typ char ist identisch zum Typ short. Beide belegen 1Byte und nehmen zahlen im bereich von -128 bis 127 auf. die Trennung macht das ganze übersichtlicher, wann man nun ein ASCII Zeichen oder eine Dezimalzahl benötigt.
-
THE_FreaK schrieb:
der Typ char ist identisch zum Typ short. Beide belegen 1Byte und nehmen zahlen im bereich von -128 bis 127 auf.
Blödsinn
-
THE_FreaK schrieb:
der Typ char ist identisch zum Typ short. Beide belegen 1Byte und nehmen zahlen im bereich von -128 bis 127 auf.
der war gut *atomrotfl*
naja also um genauer zu sein:
es gilt:
sizeof(char) <= sizeof(short)
und sizeof(char) == 1
ob char signed oder unsigned ist, ist aber nicht garantiert ist beides möglich.
-
@japro Danke für die Ausführung zu der ein gewisser MOD je nicht in der Lage zu sein scheint.
Mein eines C Buch sagt genau das was ich geschrieben hab, das 2. (vermutlich eh bessere) stimmt mit Japro überein, hab bei meinem post das nur grad nicht zur hand gehabt.
Wenn char nun aber mal sigend/mal unsigned ist, dann könnte es doch uU bei
int i=c; //bzw
char c=i;
zu fehlern kommen, da plötzlich ein vorzeichen dazwischen funkt, oder seh ich das falsch?
-
THE_FreaK schrieb:
Mein eines C Buch sagt genau das was ich geschrieben hab, das 2. (vermutlich eh bessere) stimmt mit Japro überein, hab bei meinem post das nur grad nicht zur hand gehabt.
Na dann kannst du ja eh selber nachlesen....
Wenn char nun aber mal sigend/mal unsigned ist, dann könnte es doch uU bei
int i=c; //bzw
char c=i;
zu fehlern kommen, da plötzlich ein vorzeichen dazwischen funkt, oder seh ich das falsch?int i=c; wird so ziemlich immer funktionieren. Denn ich kenne keine Platform wo sizeof(int)==1 ist... und bei sizeof(int)==2 kann es schon nicht mehr zu fehlern kommen.
bei char c=i; ist es natürlich etwas anderes. Aber das sollte ja klar sein. sizeof(int) auf gängigen 32Bit Plattformen == 4. Das bedeutet dass wir 4 Byte versuchen in 1 Byte reinzubekommen... kann nicht gut gehen.
Aber: wir verwenden ja nur Werte kleiner 127 - schließlich gibt es ja nicht so viele Zeichen (wenn wir alle 256 Werte brauchen, dann nehmen wir unsigned char)Aber auch logisch dass ein char c=1438638; nicht gut gehen kann
-
@Shade Es geht doch
//Edit
vergesst eserst lesen dann posten
-
Geht nicht auch:
char c='A'; printf ("der Buchstabe %c hat den ASCII-Wert %d", c, c);
EDIT: Wenn ich "%s" schreibe, gibt es bei mir eine Speicherschutzverletzung - oder so ähnlich.
-
THE_FreaK schrieb:
@Shade Es geht doch
Ja
, man bekommt dann so einen schicken, viereckigen Kasten
-
flyingCoder schrieb:
Geht nicht auch:
char c='A'; printf ("der Buchstabe %c hat den ASCII-Wert %d", c, c);
Das geht nur wenn int und char gleich groß sind. Das dürfte eher selten vorkommen.
flyingCoder schrieb:
EDIT: Wenn ich "%s" schreibe, gibt es bei mir eine Speicherschutzverletzung - oder so ähnlich.
%s bezeichnet doch einen String, also char*. Das ist hier OT.
-
cd9000 schrieb:
Das geht nur wenn int und char gleich groß sind. Das dürfte eher selten vorkommen.
ich habe es mit MSVC ausprobiert - es geht.
-
Ok. Das funktioniert auf x86 CPUs fast immer.
Das liegt aber nicht daran, dass der Code korrekt ist. Das liegt daran, dass bei der Parameterübergabe nur 32Bit-Worte auf den Stack gepusht werden, obwohl char nur 8 Bit hat. Deswegen ist in diesem Fall char und int gleichwertig.Undefiniert ist der Code deswegen, weil du ein char übergibst, im Formatstring aber behauptest es sei ein int. Das kann gutgehen, wenn int und char auf dem Stack gleich groß sind, muss aber nicht.
In einer anderen Umgebung (Compiler, CPU, OS, ...) verursacht dieser Code einen Speicherfehler oder gibt falsche Werte aus.
-
mach einfach
printf("%c - %d\n", c, (int)c);
und es müsste passen.