Forum: PC-Programmierung 2 interger in C zusammenfügen


von Christian B. (sourcecode)


Lesenswert?

Hallo,

ich würde gerne 2 integer Zahlen zu einer zusammenfügen.
Habe mal gegooglet und auch zig Beispiele gefunden wie dieses:

a=2;
b=3;
c=ab;
c = 10 * a + b

Das funktioniert ja auch soweit, aber was mache ich, wenn a=0 ist und 
ich
die Null aber auch benötige ... z.B 03 (um eine Uhrzeit zu speichern) ?.

Jemand einen Tipp eine Idee ?.

Vielen Dank im voraus.

Gruß
Christian

von Peter II (Gast)


Lesenswert?

Christian B. schrieb:
> Jemand einen Tipp eine Idee ?.

geht nicht. ein int kann keine vornull speichern.

die Vornull ist doch nur für den Menschen relevent, also schreibe sie 
auch nur bei der ausgabe mit hin.

von Frank W. (Firma: DB1FW) (frankw) Benutzerseite


Lesenswert?

03 ist als Integer genau das gleiche wie 3
Genauso wie 003

Als String wäre es unterschiedlich.

Wenn Du also - worauf Du wahrscheinlichj hinauswillst - so etwas
wie "03" irgendwo ausfgeben möchtest, dann sollte
das in der Funktion gemacht werden, die für die Ausgabe verantwortlich 
ist.

von Udo S. (urschmitt)


Lesenswert?

Frank W. schrieb:
> Genauso wie 003

Ausser 007. Der ist was besonderes.
SCNR

Um noch was sinnvolles zu sagen:
Sorry aber so lernt man nicht programmieren. Du brauchst ein 
Grundlagenbuch und musst es auch durcharbeiten.
Stichwort zu deinem Problem könnte "sprintf" oder "printf" sein. 
Darstellung numerischer Werte mit führenden Nullen

: Bearbeitet durch User
von Max H. (hartl192)


Lesenswert?

In BCD kann man die führende Null mitspeichern, man kann die Zahl auch 
"normal" speichern und nur beim Anzeigen die Null hinzufügen.

von Frank W. (Firma: DB1FW) (frankw) Benutzerseite


Lesenswert?

Max H. schrieb:
> In BCD kann man die führende Null mitspeichern


In jeder Variable werden "die führenden Nullen mitgespeichert".
"Leerer als Null" kann man nicht in eine Variable speichern.
Da unterscheidet sich BCD nicht von allem anderen.

von Peter II (Gast)


Lesenswert?

Frank W. schrieb:
> In jeder Variable werden "die führenden Nullen mitgespeichert".

und wie viele? 2, 10 oder 100? Dann könnte man damit ja Daten 
übertragen.

von Frank W. (Firma: DB1FW) (frankw) Benutzerseite


Lesenswert?

In einer (Beispiel) unsigned-int will ich eine 4 und eine 04 und eine 
004 speichern. Auf meinem Beispielrechner habe die unsigned-int eine 
länge von 16 Bit.


  4 = 0x0004  ( 0000000000000100 )
 04 = 0x0004  ( 0000000000000100 )
004 = 0x0004  ( 0000000000000100 )

Es steht also immer 0004 drin.

Wie gesagt - leerer als 0 geht nicht.
es gib nur "0004". Kein " 004", "  04" oder "   4".

Die Frage wie man es anzeigen will ist eine andere.

von Peter II (Gast)


Lesenswert?

Frank W. schrieb:
> Es steht also immer 0004 drin.

und warum nicht 00004?

von Oliver S. (oliverso)


Lesenswert?

Frank W. schrieb:
> Es steht also immer 0004 drin.

Das ist natürlich gleich doppelt Quatsch. Zum einen passen in 16-Bit 
binär fünfstellige Dezimalzahlen, es müsste daher 00004 heißen, zum 
anderen steht da aber trotzdem nur 0000000000000100 drin.
4 oder 04 oder 004 oder 0x04, oder was auch immer, ist lediglich eine 
formatierte Ausgabe dieser Binärzahl.

Oliver

von Bastler (Gast)


Lesenswert?

Achtung mit führenden Nullen:
1
if( 10 != 010 ) prinft("ätsch\n");
2
if(  8 == 010 ) printf("genau!\n");
Stichwort Oktal-Zahl.

von Frank W. (Firma: DB1FW) (frankw) Benutzerseite


Lesenswert?

Oliver S. schrieb:
> Das ist natürlich gleich doppelt Quatsch.

Du hast vollkommen Recht.
Ich hatte in den Zeilen obendran immer 0x0004 geschrieben.
In der Zeile, auf die Du Dich beziehst, habe ich das 0x vergessen.

> zum anderen steht da aber trotzdem nur 0000000000000100

genau. So wie es da geschrieben steht.

> 4 oder 04 oder 004 oder 0x04, oder was auch immer, ist lediglich
> eine  formatierte Ausgabe dieser Binärzahl.

Auch da hast Du recht. Deshalb steht oben ja auch
> Die Frage wie man es anzeigen will ist eine andere.

Nun kann man das als "doppelt Quatsch" bezeichen - muss es aber nicht.

: Bearbeitet durch User
von Rolf M. (rmagnus)


Lesenswert?

Peter II schrieb:
> Frank W. schrieb:
>> In jeder Variable werden "die führenden Nullen mitgespeichert".
>
> und wie viele? 2, 10 oder 100?

Soviele, wie halt noch in der Variable übrig sind.

> Dann könnte man damit ja Daten übertragen.

Tut man doch. Die Nullen sind die Daten.

Oliver S. schrieb:
> 4 oder 04 oder 004 oder 0x04, oder was auch immer, ist lediglich eine
> formatierte Ausgabe dieser Binärzahl.

Genau genommen ist es eine formatierte und in eine andere Zahlenbasis 
umgewandelte Ausgabe der Interprätation dieser Zahl als Dualzahl. 
Letztendlich sind selbst 0 und 1 nur eine spezielle Interpretation der 
Zustände eines Bits.

von Db8fs (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Peter II schrieb:
>> Frank W. schrieb:
>>> In jeder Variable werden "die führenden Nullen mitgespeichert".
>>
>> und wie viele? 2, 10 oder 100?
>
> Soviele, wie halt noch in der Variable übrig sind.
>
>> Dann könnte man damit ja Daten übertragen.
> Tut man doch. Die Nullen sind die Daten.

Schätze er meinte, dass eine Interpretation existieren könnte, die bei 
bekannter Anzahl führender Nullen alleine durch die Kenntnis dieser Zahl 
Nutzerdaten transportieren kann. Geht aber deshalb nicht, weil die 
Rechenwerke i.A. keine Kenntnis der Dezimaldarstellung haben.

Die Dezimaldarstellung selber ist ja nur eine Darstellungsform einer 
Dualzahl (genauso wie Hex oder sonstige b-adische Systeme), wo die Zahl 
halt durch ein 10-stelliges Ziffernalphabet repräsentiert wird. Je mehr 
Stellen das Ziffernalphabet (bei Hexadezimal hält 16 Symbole), desto 
kompakter die Darstellung.

> Oliver S. schrieb:
>> 4 oder 04 oder 004 oder 0x04, oder was auch immer, ist lediglich eine
>> formatierte Ausgabe dieser Binärzahl.
>
> Genau genommen ist es eine formatierte und in eine andere Zahlenbasis
> umgewandelte Ausgabe der Interprätation dieser Zahl als Dualzahl.
> Letztendlich sind selbst 0 und 1 nur eine spezielle Interpretation der
> Zustände eines Bits.

Genau, die Zahl ist rechnerintern dual, aber es kann halt diverse 
Interpretationen davon geben.

von Rolf M. (rmagnus)


Lesenswert?

Db8fs schrieb:
> Schätze er meinte, dass eine Interpretation existieren könnte, die bei
> bekannter Anzahl führender Nullen alleine durch die Kenntnis dieser Zahl
> Nutzerdaten transportieren kann. Geht aber deshalb nicht, weil die
> Rechenwerke i.A. keine Kenntnis der Dezimaldarstellung haben.

Ja. Es handelt sich natürlich nicht um dezimale Nullen, die da drin 
stehen, zumindest nicht, solange man in der Variable kein gepacktes BCD 
speichert.

von Lenny D. (le-do)


Lesenswert?

So interessant ich diese Überlegungen auch finde weiß ich nicht ob sie 
dem TE helfen werden ;)
Wenn du mit 2Zahlen zusammenfügen nicht die Addition meinst sondern das 
Aneinanderhängen, dann ist wie schon erwähnt eine Zahl nicht der 
richtige Datentyp.
Istja im Matheunterricht nicht anders, da ist 3+0 eben 3 und nicht 30, C 
hält sich natürlich strikt daran. Beim Speichern eines Datums 
interessiert diese führende Null ja auch gar nicht, daher ist das schon 
sinnvoll.
Der einzige Fall wo das von Interesse ist ist bei der Ausgabe an 
Menschen, also per RS232 oder LCD oder 7Segment oder so. Da habe ich 
gerade in FAQ einige gute Tipps entdeckt, Stichwort itoa()
Falls dir Datentyp, String, Charakterarray und int noch nichts sagen, 
würde ich auch erst mal einen einfachen Anfang mit Buch oder zumindest 
Tutorial empfehlen.

von Db8fs (Gast)


Lesenswert?

Lenny D. schrieb:
> So interessant ich diese Überlegungen auch finde weiß ich nicht ob
> sie
> dem TE helfen werden ;)

Die Lösung wurde ja auch bereits genannt. Konkret die Verwendung von 
formatierter Ausgabe, wie z.B. per sprintf und Nutzung des richtigen 
Formatspezifiziers - siehe jeweilige libC.

Natürlich schadet es aber auch nicht, sich selber mal nen Kopf zu machen 
und nicht nur fertige Lösungen aus ner Bibliothek zu nutzen. Und bei den 
augenscheinlich erheblichen Sprachdefiziten bezüglich ANSI-C des 
Threaderöffners (bitte nicht in den falschen Hals kriegen), ist es sehr 
ratsam, auch gewisse Grundlagen mal zu diskutieren.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.