interne Dartstellung der Zahl

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von 3daycliff.

    interne Dartstellung der Zahl

    Hallo erstmal,

    bin ein Neuling hier und versuche mich gerade an VB deshalb hier meine Frage.

    Ich habe eine Übungsaufgabe, bei der ich nicht genau weis, um was es genau geht. Kann mir da evtl. jemand helfen?
    Habe meine Unterlage schon mind. 5 mal durchgeblättert finde aber nicht wie ich auf die Lösung kommen soll bzw. kapiere die Frage einfach nicht.

    In einer Prozedur sind die beiden Variablen strZahl vom Datentyp string und die Variable intZahl
    vom Datentyp integer. Der Variablen strZahl wird die Zahl 100 zugewiesen. Anschließend wird
    diese Zahl von der Variablen strZahl an die Variable intZahl zugewiesen. Wie sieht die interne
    Darstellung der Zahl in den beiden Variablen aus und wie kann man das feststellen?

    Schon mal vielen Dank für Eure Hilfe.

    LG
    Hidee ?(

    Verschoben. ~Thunderbolt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()

    Willkommen im Forum. :thumbup:

    Hidee schrieb:

    Datentyp string
    ist, wie der Name schon sagt, ein String und keine Zahl.
    Dieser String, der eine Zahl darstellt, nachdem ihm der String "100" (nicht aber 100!!!), kann in eine Zahl konvertiert werden vermöge der Operation Dim value As Integer = Integer.Parse(strZahl).
    Mit diesem Wert kannst Du rechnen.
    Da Du hier gerade ein recht heißes Eisen anfasst, sorge bitte dafür, dass Dein Projekt und Deine zukünftigen Projekte sorgfältig unterscheiden zwischen den einzelnen Datentypen.
    Gugst Du hier.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Hidee schrieb:

    In einer Prozedur sind die beiden Variablen strZahl vom Datentyp string und die Variable intZahl
    vom Datentyp integer. Der Variablen strZahl wird die Zahl 100 zugewiesen. Anschließend wird
    diese Zahl von der Variablen strZahl an die Variable intZahl zugewiesen. Wie sieht die interne
    Darstellung der Zahl in den beiden Variablen aus und wie kann man das feststellen?
    Ist das die Übungsaufgabe?

    Beende den Kurs - der Kursleiter hat keine Ahnung.
    Wie Rod schon sagt, da werden Datentypen nicht unterschieden, und wer dir sowas beibringt, der vergiftet dich.

    Übrigens die richtige Antwort auf diese Frage ist, dass sie unmöglich zu beantworten ist. Einem String kann man nicht die Zahl 100 zuweisen, feddich.
    Wie gesagt, wer dir was anderes erzählt, vergiftet dich - das ist keine Übertreibung.
    Denn sobald du anfängst das zu glauben (dass man einem String eine Zahl zuweisen kann), bist du extrem behindert im Versuch, Programmieren überhaupt zu verstehen.
    jo, bin ich auch gespannt - meldeste das zurück, bitte?

    Du kannst auch die Fragestellung korrigieren, und dann schon was zur internen Darstellung sagen:
    also die kleinste Einheit aller Daten ist Byte, und alle Daten sind letztlich Bytes - 8 Bit - so liegt das Zeug im Speicher rum.
    Ein Integer belegt 4 Bytes, also 32 bits, das heisst ein int kann 2^32 verschiedene Zahlen darstellen.

    Ein String ist komplizierter. Das ist zunächstmal ein Pointer auf eine Speicherstelle, wo der String dann tatsächlich ist.
    Und an dieser Speicherstelle steht zunächstmal, wie lang der String ist, und dann kommen die einzelnen Zeichen (Buchstaben, Ziffer-Zeichen, Interpunktion, whatever).
    Jedes Zeichen belegt 2 Bytes, kann also 2^16 verschiedene Zeichen darstellen, das sind bisserl mehr als 65000 Stück.
    Was wir als Buchstaben, Ziffer-Zeichen, Interpunktion kennen ist also nur ein Winz-Bruchteil dessen, was ein Char alles darstellen kann, zB. sind glaub die meisten chinesischen Schriftzeichen mit aufgenommen.
    "Mit aufgenommen" bedeutet, es gibt eine internationale Norm, die jedem der 65000 Zustände, die ein Char annehmen kann, eine Bedeutung zuweist.
    Und da gibts allerlei komisches Zeugs, so kleine Pictogramme, Pfeile, Linien, und wie gesagt für die Chinesen ist da auch ein großer Haufen an Bedeutungen definiert.
    范围控制字符

    Du siehst: eine intZahl kann man nie und nimmer einem String zuweisen, das ist wie, wenn du im Laden an der Kasse versuchst, mit Tannenzapfen zu bezahlen, oder mit Plankton.
    Ja, genau: Versuch mal im Laden deine Einkäufe mit Plankton zu bezahlen - genau so abartig ist die Idee, einem String eine intZahl zuzuweisen.

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Ich nehme an, dass der Lehrer noch aus einer Welt kommt, in der ein String nur aus 8-Bit-Chars bestehen kann.
    Der String "100" also aus einer Folge der ASCII-Zeichen "1", "0", "0" besteht.
    Also drei Bytes: 0x31, 0x30, 0x30
    Binär: 00110001 00110000 00110000
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Hidee schrieb:

    was ändern
    :rolleyes:
    Nein.
    Schreib zum Test "Roullade mit Klößen" rein und verfolge, was passiert.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Schreib zum Test "Roullade mit Klößen" rein und verfolge, was passiert.

    Volle Punktzahl. Und schreib' noch darunter sowas wie: "Wer bin ich und wenn ja wie viele?" (Na, wer kennt's?)
    Dazu hätte ich nochmal eine Frage.
    Wäre es demnach nicht (so einfach) möglich Strings / Zeichenketten / char Arrays zwischen z.B. c(++) und .Net (c#,Vb..) auszutauschen? Weil bei c(++) wäre ein char ja nur 1 Byte, und z.B. ein short int 2 byte...
    und dazu: wie werden denn dann Strings in einer Datei gespeichert? bei .net als utf-8 und c ascii (ansi)?

    Gibt es denn da bei .Net und C(++) Konvertierungsfunktionen?

    lg Marcel

    Edit: und wie erkennt man dann ob es sich um ansi/utf-8 handelt? (im programm)
    Habe jetzt nicht den ganzen Thread gelesen, aber:

    In C hat ein "short int" nicht immer zwei bytes. Der Standard schreibt einen Wertebereich von -32767 bis +32767 vor, das wars. Der Compiler macht da ggf. auch 4 bytes raus.

    Strings werden so in einer Datei abgespeichert wie... nun, wie du sie halt abspeicherst. Eigentlich kannst du das bei den Methoden auch immer mit angeben, welches Encoding verwenden werden soll. Ein Blick in die MSDN ist hier hilfreich.
    System.IO.File.WriteAllText verwendet standardmäßig UTF-8 ohne BOM und System.IO.Stream.Write schreibt einfach nur bytes.

    Und in Bezug auf C gibt es nicht wirklich eine Antwort. Der Standard definiert keinen Standard-Zeichensatz und kennt AFAIK eigentlich nur bytes bei IO-Operationen.

    Das Encoding kannst du zum Teil über die Byte Order Mark erkennen, macht z.B. System.IO.File.ReadAllText: "This method attempts to automatically detect the encoding of a file based on the presence of byte order marks. Encoding formats UTF-8 and UTF-32 (both big-endian and little-endian) can be detected.". Andernfalls musst du das einfach wissen.
    ASCII ist übrigens eine Untermenge von UTF-8. Wenn du UTF-8 kannst, kannst du automatisch ASCII. Und wenn du nur zwischen ASCII und UTF-8 unterscheiden willst, kannst du dir einfach die bytes anschauen. Hat z.B. eines einen Wert größer 127, handelt es sich nicht um ASCII.
    Gegenfrage: In welchem Zahlensystem ist folgende Zahl dargestellt: 12?

    Du kannst mit Sicherheit sagen, Unär und Binär sind es nicht. Es könnte Dezimal sein, oder vielleicht Oktal? Möglicherweise ist es auch zur Basis 7. Ohne zusätzliche Informationen (wie z.B. das in DE standardmäßig das Dezimalsystem verwendet wird) kann man nur Vermutungen anstellen.

    UTF-8 bzw. ASCII sind meist gute Vermutungen, wenn keine BOM oder andere Informationen vorhanden sind. Bei etwas älteren Sachen vielleicht noch ISO-8859-1 und bei System i vielleicht EBCDIC (wobei man dort ohne CCSID auch aufgeschmissen ist). Sicher kann man sich aber nicht sein.