Wie viele Zeichen kann string speichern / interne darstellung von string?

tryn4x

Neues Mitglied
Hallo

Ich habe ein kleines Problem, bei dem ich einfach nicht voran komme.
Ich habe großes Interesse an "C#" und mir ein neues Buch gekauft, bin allerdings noch ganz am Anfang.

Ich komme an einer Stelle im Buch nicht weiter!
Zitat;

char beschränkt sich auf ein Zeichen. Um eine Zeichenkette, die sich aus keinem oder bis zu maximal ca. 2^31(2 hoch 31) Einzelzeichen zusammensetzt, zu speichern oder zu bearbeiten, deklarieren Sie eine Variable vom Datentyp string. Die Einzelzeichen werden dabei wie bei char als Unicode-Zeichen der Größe 16 Bit behandelt.

Meine Frage er gibt sich daraus, das ich nicht genau weis wie hier 2^31(2 hoch 31) zustande kommt.
4 Byte ergeben ja 32 Bit. Der Index beginnt immer bei Null (0). Liegt es daran?
Liegt es an dem "Einer- Zweierkomplement?
Ich stehe mega auf dem Schlauch und je weiter ich versuche das "Rätzel" zu lösen, verwirre ich mich nur um so mehr.
Ich kann aber nicht weiter machen bevor ich's nicht verstehe.
Warum 2^31 (2 hoch 31)?

Würde mich über Antwort freuen
Grüzze gehen raus
 

Lowl3v3l

Mitglied
devCommunity-Experte
2³¹ Byte sind genau 2 Gibibyte, bei 16 Bit pro Zeichen Unicode ergibt das eine Gesamtgröße von 4 Gibibyte, was das Maximum ist, das mit 32 Bit-Pointern adressierbar ist, also wieviel ein 32 Bit System im Ram (ohne Hacks wie PAE) adressieren kann. Ich denke, ohne C#-Programmierer zu sein, die Limitierung kommt daher.
 

german

Aktives Mitglied
devCommunity-Experte
Schau mal dort:
Es geht also darum bis zu welchem Wert die Länge eines Strings dargestellt werden kann. Int32 repräsentiert eine vorzeichenbehaftete ganze Zahl mit einer Speicherbreite von 32 Bit. Heißt, wir reden von einem Bereich zwischen -2147483648 und 2147483647 mit der die Länge eines Strings repräsentiert werden kann. Negative Zahlen sind natürlich eigentlich unsinnig. Wie auch immer, 2^31 - 1 wäre also hier eigentlich korrekt. Alles andere als Zweierkomplement kannst du auf normalen Betriebssystemen quasi ignorieren. Warum Int32 als Typ gewählt wurde hat @Lowl3v3l oben erklärt. Dem stimme ich zu.
 

tryn4x

Neues Mitglied
Hallo.
Danke für die schnelle Antwort
Leider ist meine Frage immer noch offen.
"Jedes" System ist doch ein 32/64bit System (zumindest die neueren). Warum dann 31bit.
2^31 - 1. warum -1.
Ich kann mir nur vorstellen, das es am Zweierkomplement liegt, genau aber weis ich's nicht.
Wenn das nicht erklärt sich das nur noch mit dem Index bei Null (0)...
Sry. hoffe nicht noch mehr Verwirrung zu stiften

Grüße
Steffen
 

tryn4x

Neues Mitglied
Hallo, ich nochmal...

Danke nochmals für die Antworten.

Ich werde wohl erstmal das Thema beiseite schieben müssen, manchmal kommt mir dann nach einiger Zeit die Lösung.
Hatte ich des öfteren.
Ich habe bestimmt 4 Bücher über C/C++ gelesen und weiß, das ich dieses Thema schon einige male hatte.
Ich verstehe nur nicht, das ich das nicht in den Kopf bekomme.
Wie gesagt , manchmal muss man was beiseite legen und die Antwort kommt von allein.
Ich danke euch vielmals.

Grüße an euch
Steffen
 

tryn4x

Neues Mitglied
...
Stimmt.
Mit dem Zweierkomplement hat das nichts zu tun.
Sehe ich, nachdem ich deinen Text gelesen hab, ein
Danke.
 

german

Aktives Mitglied
devCommunity-Experte
Doch hat es. Ist ganz einfach. Binär:
das ist 2^31
10000000 00000000 00000000 00000000
Das sind 32 Binärziffern. Das MSB ist 1, alle anderen 0. Das wird als -2147483648 interpretiert. Ist halt Zweierkomplement.
Wenn du hier -1 rechnest, wird es
01111111 11111111 11111111 11111111
Das ist die größte Zahl bei der das MSB 0 ist und somit noch als positives Integer interpretiert wird. und dezimal ist das 2147483647.
 

tryn4x

Neues Mitglied
Also ist das die Antwort?!?!
Dann war ich mit der Richtung in meine Kopf ja nicht ganz falsch.
Boah, das war eine schwere Geburt. Hoffe ich hab deine Nerven nicht ganz so strapaziert.
Ich werde mir in Zukunft zu allem, von den beiden Sprachen, eine Notiz machen.
Ich bin dir mega Dankbar.

Special Thx und grüße
Steffen

Eidit:

Edit:

In C/C++ ist ein "char" intern wohl nichts anderes als ein "int"
Sollte ich zumindest recht in Erinnerung haben.
Dann ist dies wohl auch in C# so?!!
 
Zuletzt bearbeitet:

Lowl3v3l

Mitglied
devCommunity-Experte
Nein, das stimmt für C/C++ NICHT. Also ganz grundsätzlich nicht. Richtig ist, dass du char immer nach int casten kannst, das ist aber auch alles. Die Standards definieren nicht einmal, ob char signed oder unsigned ist oder wie viel bits sie haben (das hat historische Gründe, 8 Bit = 1 Byte ist mittlerweile einfach normal bei von-Neumann-Maschinen). Wie groß int ist ist da auch nicht vorgeschrieben, AFAIK sagt der standard nur mindestens so groß wie short und höchstens so groß wie long, long selbst kann genauso groß sein wie long long, wenn nicht muss long long größer sein.
C# ist da gleich eine ganz andere Kiste, es legt char auf 2 Byte(= 16 Bit) fest, int auf 4 byte, long auf 8.
 

german

Aktives Mitglied
devCommunity-Experte
In C/C++ ist ein "char" intern wohl nichts anderes als ein "int"
Oh, das ist so nicht richtig. Ein char-Literal (also wenn es hart in den Programmcode geschrieben wird) ist laut C Standard ein int und nach C++ Standard ein char. Ansonsten ist und bleibt ein char ein char und ist quasi immer 8 Bit breit (Ausnahmen mit exotischen Betriebssystemen sind zu ignorieren).
C# arbeitet mit 2 Byte (16 Bit) breiten Code Units. Das ist das was in C und C++ auf Windows ein wchar_t wäre. (Nicht auf Linux, aber das würde jetzt noch mehr Verwirrung stiften …)
 
Oben Unten