[C#] Frage zu Variablen

White Tiger

Cadet 3rd Year
Registriert
Mai 2002
Beiträge
36
Frage zu C# Variablen

Guten Morgen

So ich arbeite mich grad in C# ein. Verwende das Buch C# in 21 Tagen.
Also habe da ein Programm

Code:
using System; 

namespace Kap3 
{ 

class CUps 
{ 
static void Main(string[] args) 
{ 
int iZahl1 = 10; 
int iZahl2 = 9; 
int iErgebnis = 0; 

iErgebnis = iZahl1 - iZahl2; 
Console.WriteLine("{0}",iErgebnis); 

Console.ReadLine(); 
} 
} 
}

So das Teil funktioniert bestens und wirft den Wert 1 aus. So die Zahl 10 bzw. 9 sind literalen Konstanten und werden als Variable int deklariert. So das der Speicherbereich von int 0-4.294.967.295 beträgt hätte ich gern die Variable short genommen (Speicherbereich)+ 32.767 nur als Beispiel da ja int die reinste Verschwendung ist beim Zahlenwert 10.

Code:
using System; 

namespace Kap3 
{ 

class CUps 
{ 
static void Main(string[] args) 
{ 
short sZahl1 = 10; 
short sZahl2 = 9; 
short sErgebnis = 0; 

sErgebnis = sZahl1 - sZahl2; 
Console.WriteLine("{0}",sErgebnis); 

Console.ReadLine(); 
} 
} 
}

So jetzt wirft mir Visual .NET den Fehler raus "Implizite Konvertierungen des Typs int zu short nicht möglich! Wenn ich das ganze dann so mache

Code:
using System; 

namespace Kap3 
{ 

class CUps 
{ 
static void Main(string[] args) 
{ 
int iZahl1 = 10; 
short sZahl1 = 0; 
sZahl1 = (short) iZahl1; 
int iZahl2 = 9; 
short sZahl2 = 0; 
sZahl2 = (short) iZahl2; 
int iErgebnis = 0; 
short sErgebnis = 0; 
sErgebnis = (short) iErgebnis; 

sErgebnis = sZahl1 - sZahl2; 
Console.WriteLine("{0}",sErgebnis); 

Console.ReadLine(); 
} 
} 
}
die gleiche Fehlermeldung!
Es muss doch möglich sein das ganze in short abzulegen. int ist ja verschwendunmg!! Was mach ich falsch??

Thanks
 
Zuletzt bearbeitet von einem Moderator: (Bitte den [code]-Tag verwenden!)
Re: Frage zu C# Variablen

ich tippe mal darauf, dass der befehl WriteLine keine shorts verarbeitet. versuchs mal mit:
Code:
Console.WriteLine("{0}",sErgebnis.toString());

ps: ein short ist immernoch verschwendung, nimm ein byte, das sind nur 8 bit (0..255), short sind 2 byte! ;)
 
Re: Frage zu C# Variablen

Das short immer noch Verschwendung ist ist schon klar. Mir gings nur um diese Variable. Habe das ganze mit long probiert (die Krönung an Verschwendung) und da gings. Das geile an dem Buch ist ja das int zu long erklärt wird am Zahlenwert (Achtung) 50. Aber int zu short nett. Deine Idee werd ich mal probieren. Ist eventuell die Lösung. Kommt eventuell noch später im Buch das Console.WriteLine nicht mit allen Variablen kann. Thanks
 
Ich denke, das liegt daran, dass die CLR intern nur mit Int-Werten "rechnen" kann:

dH, Du solltest bei deinem ersten Beispiel erst die beiden shorts zu int casten und das ergebnis zurückcasten nach short:

sErgebnis = (short) ( (int)sZahl1 - (int)sZahl2 );

Ich habe allerdings gerade unter C# die Erfahrung gemacht, dass es meistens besser ist nicht direkt zu casten, sondern dafür die Klasse Convert zu nehmen, damit kann man schlichtweg alles zu allem konvertieren:

sErgebnis = Convert.ToSByte( Convert.ToInt32( sZahl1 ) - Convert.ToInt32( sZahl2 ) );

Durchhalten!! Und nicht zu früh von den zugegebenermassen am Anfang öfters mal vorhandenen Stolpersteinen die Lust nehmen lassen.

Mir ist in meiner Laufbahn (>20 Jahre Programmiererfahrung: Assembler, Ansi C, C++, C#, Cobol, Java, Pascal, PHP) noch nichts eleganteres und letztendlich sicheres begegnet wie C#...achja, und versuch' gar nicht erst an Pointer zu denken...*g*
 
Re: Frage zu C# Variablen

Green Mamba schrieb:
ps: ein short ist immernoch verschwendung, nimm ein byte, das sind nur 8 bit (0..255), short sind 2 byte! ;)
Nicht wahr, das ist keine Verschwendung :P;) Da in einem 32-Bit Rechner Variablen immer auf 32 Bit Grenzen (meist sogar 64) gepaddet werden, ist es "egal". Möglicherweise kann man den Compiler anweisen, es anders zu machen, ist aber mit Leistungseinbußen verbunden. Ganz egal ist es natürlich nicht, da man immer den Datentyp mit dem für das Ergebnis passenden Bereich nehmen sollte.
 
Re: Frage zu C# Variablen

ach ja, warum gibts dann verschiedene datentypen? wenn ich 10 mio integers aloziiere, braucht das sehr wohl mehr platz als 10 mio vom typ byte! :D
kannste ja mal selbst ausprobieren... :p

oder ist da bei c# grundlegend anders als bei anderen sprachen?
 
Habe ich gerade sicherheitshalber ausprobiert ;) Zugegebener Maßen nicht in C#, aber es geht da denke ich mal eher um's Prinzip.
Der Speicherverbrauch von 1000 Integers und der von 1000 Bytes war der selbe. Kannst ja auch mal ausprobieren ;)

Erklärung:
Daten werden zur Optimierung immer an 32-Bit Grenzen im Speicher abgelegt, da der Prozesser sonst nur ineffizient darauf zugreifen kann. Wenn Du ein Integer mit der Länge 4 Bytes im Speicher ablegst, passt das exakt. Wenn Du nun ein Byte ablegst, werden vom Heapmanager danach 3 Bytes fürs Padding (aufstocken auf die nächste 32-Bit Grenze) markiert. Deshalb ist der Speicherverbrauch physikalisch der selbe.
Okay okay, zugegebener Maßen ist das eine sehr maschinenabhängige / compilerabhängige Angelegenheit. Trotzdem wird es fast immer so gehandhabt auf "normalen PC-Systemen". Auf 64 Bit Systemen könnte sich die Verschwendung sogar noch erhöhen.

Der Sinn von den verschiedenen Datentypen ist halt der logische. Wenn Du beispielsweise einen TCP-Port speichern willst, kannst Du dafür einen Integer nehmen. Der unsigned short wäre allerdings hier der zu bevorzugende Datentyp, da er exakt wie die Ports von 0 bis 65535 reicht. Durch den passenden Datentyp kann man logische Fehler bereits zur Compilezeit bekämpfen.
 
Zurück
Oben