PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Unterschied zwischen Casting und atoi, atof usw



Woosh
26-03-2007, 17:26
hi leute,

ich denke zwar, dass das eine ziemlich noob-frage ist (kommt wohl daher, dass ich ein NOOB BIN ^^), aber frag mich schon länger, was eigentlich beim casten anders gegenüber atoi, atof usw ist.
kann mir das mal jemand sagen? wäre sehr nett ;-)

danke der bemühungen
lg woosh

peschmae
26-03-2007, 18:48
Ein char ist eigentlich eine 8-Bit Zahl. d.h. stellt Werte dar zwischen -128:127 respektive 0:255.

Wenn du nun einen char hast mit einer Zahl drin und den in einen Int umwandeln willst dann benutzt du einen cast.

Wenn du den char hingegen zur Speicherung eines Ascii-Zeichen benutzt hast dann sieht das anders aus. Wenn du jetzt einfach einen cast nach Int machst kriegst du die Ascii-"Tabellenplatznummer" des Zeichens.
Für den Fall dass das was im Char ist aber eine Zahl ist, willst du u.U. nicht die Ascii-Tabellenplatznummer sondern die eigentliche Ziffer.

Den Unterschied siehst du z.B. hier:


#include <stdio.h>
#include <stdlib.h>

int main() {
char c = '9';
printf("%d %d %d\n", (int)c, atoi(&c), (int)(c - '0'));
return 0;
}


gibt aus:


57 9 9


das erste ist der Ascii-Code - das was "wirklich" im char gespeichert ist. Das zweite die Ziffer die du eigentlich da gespeichert hast, also der character. Das dritte ist eine etwas andere Art an die Ziffer zu kommen (die Zeichen 0-9 sind aufeinanderfolgend in der Ascii-Tabelle, wenn man vom Ascii-Code einer beliebigen Ziffer den Ascii-Code der Ziffer 0 subtrahiert kriegt man die Ziffer selber als Resultat)

MfG Peschmä

Woosh
28-03-2007, 18:11
aha, aber wieso castet man dann extra? das versteh ich ned ganz... an den ascii-wert kommt man ja auch, wenn man z.b. sowas hier macht:

#include <stdio.h>

main() {
char c = '9';
printf("%d", c);
return 0;
}

oder ned?

lg woosh

peschmae
28-03-2007, 19:26
Da wird auch gecastet - nur halt implizit.

Wobei ich jetzt zugegebenermassen die Details von printf konkret nicht kenne. Das kommt dann auch auf die verwendeten Konventionen (ABI) an.
Zum Beispiel wird auf Nios (eine 32-bit Soft-Embedded Prozessorarchitektur) jeder Parameter an eine Funktion in einem Register übergeben (solange die Funktion nicht all zu viele Parameter benötigt - also faktisch nur die ersten 8 oder so) - die sind alle 32 bit gross. d.h. alles was kleiner ist als 32 bit wird da aufgepustet. Dürfte bei x86 gleich sein.

Wieso man explizit castet? Kommt auf die Situation drauf an u.U. weil:
- man im Code deutlich machen will dass man castet
- weil sonst was schief gehen würde oder könnte
- grundlos

MfG Peschmä

Woosh
28-03-2007, 20:15
jetz fällts mir grade auf... %d kann ich ja nur im printf benutzen... bzw. anderen ausgabefunktionen! wenn ich jetz z.b. mit einem zeichen (bzw. dem zugehörigen ascii-wert) rechnen will... dann interessiert das die berechnung n sch***dreck, ob vorher über die funktion printf() ein string über %d ausgegeben wurde ;)
kurz: für berechnungen mit dem ascii-wert eines zeichens MUSS man fast casten, weil man kontrollwörter wie z.b. %d nicht überall benutzen kann!
hab ich das richtig verstanden?

lg woosh

peschmae
28-03-2007, 21:02
Naja, eigentlich musst du nicht unbedingt casten. Zumindest meist nicht explizit. z.B. oben das
(c - '0') - da wird auch die Subtraktion gemacht ohne dass ich erst caste.

Wenn dein Compiler/Architektur z.B. vor jeder Addition alles in 32-Bit grösse haben will dann macht er das selber. Sein Problem.

MfG Peschmä

Digedag
28-03-2007, 22:03
Wieso man explizit castet? Kommt auf die Situation drauf an u.U. weil:
- man im Code deutlich machen will dass man castet
- weil sonst was schief gehen würde oder könnte
- grundlos
Ich würde sagen der Hauptgrund für explizites Casten ist, daß der Compiler nicht weiß, in welchen Datentyp man umwandeln will. Falls man zum Beispiel in Float umwandeln will, muss man explizit casten.

LINK (http://www.pronix.de/pronix-618.html)

@Woosh: Bitte gib dir mit dem Ausdruck mehr Mühe. Es macht keinen Spaß deine Beiträge zu lesen.

Woosh
29-03-2007, 15:55
@Woosh: Bitte gib dir mit dem Ausdruck mehr Mühe. Es macht keinen Spaß deine Beiträge zu lesen.

okay, danke für den tipp. werd mir mühe geben.

okay, hab mir das mal durchgelesen und werd mir mühe geben, das bisschen besser zu verstehen
vielen dank für eure hilfe

lg woosh