Bits einen Integer zuweisen - was passiert?

Hi!

Hab da eine Frage bezüglich eines Casts: Wenn ich 1101001011 einer Integer-Variable zuweise, wird dieser automatisch gecastet oder?

Bsp.:
unsigned int result;
result = ADDAT & 0x03FF;

Um den echten Wert zu erhalten, muss ich dann eine Umrechnung machen? Mir gehts darum, damit ich verstehe warum ich die Umrechnung mache. Wie ich diese mache, weiß ich. Aber verstehen tu ich sie bis jetzt nicht … (* Maximalwert / Anzahl der Stufen)

Ich hoffe ihr könnt mir eine hilfreiche Auskunft geben!

Grüße
Franz

Noch eine Frage:

Was bedeutet ein Punkt hinter einer Zahl bei einer Berechnung?

Bsp:
result=(result*5.)/1024.;

Hi!

Hab da eine Frage bezüglich eines Casts: Wenn ich 1101001011
einer Integer-Variable zuweise, wird dieser automatisch
gecastet oder?

Also du hast ein Unsigned Integer von 16Bit ok
also 00000000 00000000 bis 11111111 11111111

und eine
1101001011

bei Zuweisung wird dann daraus
00000011 01001011

Bsp.:
unsigned int result;
result = ADDAT & 0x03FF;

Um den echten Wert zu erhalten, muss ich dann eine Umrechnung

was heisst „echten wert“

machen? Mir gehts darum, damit ich verstehe warum ich die
Umrechnung mache. Wie ich diese mache, weiß ich. Aber
verstehen tu ich sie bis jetzt nicht … (* Maximalwert /
Anzahl der Stufen)

Was soll jetzt Maximalwert stufen ??? , wo bist du denn hin

Ich hoffe ihr könnt mir eine hilfreiche Auskunft geben!

Nicht wirklich, wenn man nciht begreifft was du meinst.

Grüße
Franz

das wohl einer die Null vergessen hat, aber umbedingt eine kommazahl haben wollte.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Franz

Hab da eine Frage bezüglich eines Casts: Wenn ich 1101001011
einer Integer-Variable zuweise, wird dieser automatisch
gecastet oder?

1101001011 ist einfach die Dezimalzahl 1,101,001,011

Ein „binäres“ 1101001011 gibt es weder in C noch in C++.

Entweder ist es ein ‚string literal‘, dann sieht
das z.B. so aus: char binzahl[] = „1101001011“;
oder eben eine Dezimalzahl (‚numeric literal‘).

Bsp.:
unsigned int result;
result = ADDAT & 0x03FF;

Der Präfix 0x bestimmt in C/C++, dass es
sich um ein Hexadezimal-‚numeric literal‘
handelt. Es gibt darüberhinaus noch
die blanke ‚0‘ (Null) als Präfix, dann ist
es ein Oktal-‚numeric literal‘ (03456).

Um den echten Wert zu erhalten, muss ich dann eine Umrechnung
machen? Mir gehts darum, damit ich verstehe warum ich die
Umrechnung mache. Wie ich diese mache, weiß ich. Aber
verstehen tu ich sie bis jetzt nicht … (* Maximalwert /
Anzahl der Stufen)

Letzlich ist eine Dezimalzahl eine Darstellung
einer Zahl bezogen auf die „Basis“ 10, eine Binärzahl
auf die Basis 2, „Hexadezimal“ zur Basis 16 usw.

Da ein Computer sich um die „2“ Zustände „an“/„aus“
dreht, besitzt er „physikalisch“ eine Binärrepräsentation
der abgelegten Zahlen (es gibt nur 2 verschiedene Ziffern).

Ich hoffe ihr könnt mir eine hilfreiche Auskunft geben!

Hier kannst Du mal (für C++) ein wenig damit spielen:

 #include 
 #include 
 #include 
 using namespace std;

 const string get\_binary(int zahl) { 
 return bitset( zahl ).to\_string(); 
 }

 int main()
{
 int zahl = 0x03ff;
 string binzahl = get\_binary(zahl);
 
 // Ausgabe der Zahl in verschiedenen Darstellungen (Basis)
 printf("zahl: HEX=%x =\> DEC=%d =\> OCT=%o =\> BIN=%s\n\n", zahl, zahl, zahl, binzahl.c\_str());

 int neu = 0;
 printf("neue Zahl ist: %8x %8d %8o %s\n", neu, neu, neu, get\_binary(neu).c\_str());

 // Rueckrechnen des bin-strings fuer 32bit Zahlen
 // auf Intel (LSB first, 'little endian') 
 for(int pos=0,bit=1; posGrüße

CMБ

Hallo

Was bedeutet ein Punkt hinter einer Zahl bei einer Berechnung?
Bsp:
result=(result*5.)/1024.;

Das verändert den ‚numeric literal‘ Typ der Zahl von
‚integer numeric literal‘ => 5 , auf
‚double precision floating point numeric literal‘ => 5. oder 5.0

Es gänge noch 5.0f oder 5.f (single precision floating point).

Beispiel:

 ...
 int a = 2 / 10 \* 100;
 int b = 2 / 10. \* 100;
 printf("a = %d, b = %d\n", a, b);

Rate mal, was da rauskommt.

Grüße

CMБ

Beispiel:


int a = 2 / 10 * 100;
int b = 2 / 10. * 100;
printf(„a = %d, b = %d\n“, a, b);

Rate mal, was da
rauskommt.

Grüße

CMБ

Danke für die Antwort. Also wird 10 in ein double umgewandelt. Was passiert mit dem Ergebnis 2/10, ist es dann ein double?

Hallo CMБ!

1101001011 ist einfach die Dezimalzahl 1,101,001,011

Ein „binäres“ 1101001011 gibt es weder in C noch in C++.

Entweder ist es ein ‚string literal‘, dann sieht
das z.B. so aus: char binzahl[] = „1101001011“;
oder eben eine Dezimalzahl (‚numeric literal‘).

Hmmm ich arbeite bei meinem Programm auf einem Mikrocontroller. Wenn ich einem Register 0x0001 zuweise dann setze ich das letzte Bit.

Letzlich ist eine Dezimalzahl eine Darstellung
einer Zahl bezogen auf die „Basis“ 10, eine Binärzahl
auf die Basis 2, „Hexadezimal“ zur Basis 16 usw.

Da ein Computer sich um die „2“ Zustände „an“/„aus“
dreht, besitzt er „physikalisch“ eine Binärrepräsentation
der abgelegten Zahlen (es gibt nur 2 verschiedene Ziffern).

Ich erfasse die Spannung an einem Port. Aber warum rechne ich da um? Die Spannung geht dort von 0-5V. Ich habe einen 10 BIT ADC. Das Ergebnis multipliziere ich mit 5 und diviere durch 2^10. Wegen wessen Zahlenformat ist das so?

result=(result*5.)/1024.;

Vielen Dank für deine Mühe!

Grüße
Franz

Um den echten Wert zu erhalten, muss ich dann eine Umrechnung

was heisst „echten wert“

Sonst wird der falsche Spannungswert angezeigt.

machen? Mir gehts darum, damit ich verstehe warum ich die
Umrechnung mache. Wie ich diese mache, weiß ich. Aber
verstehen tu ich sie bis jetzt nicht … (* Maximalwert /
Anzahl der Stufen)

Die Spannung geht nur von 0-5 V. Wenn ich 4 V anlege bekomme ich ohne die Umrechnung 818 heraus. Sein sollten es aber ca. 4 …

Ich hoffe ihr könnt mir eine hilfreiche Auskunft geben!

Nicht wirklich, wenn man nciht begreifft was du meinst.

Sorry. Ich weiß nicht wie ich es anders sagen sollte. Vielleicht hilft das ein bisschen: http://www.wer-weiss-was.de/cgi-bin/forum/showarticl…

Grüße
Franz

Die Spannung geht nur von 0-5 V. Wenn ich 4 V anlege bekomme
ich ohne die Umrechnung 818 heraus. Sein sollten es aber ca. 4

aha

du meinst das &

also die bitweise verknüpfung

du must es deswegen mit dem wert & nehmen weil nur bestimmte bits dir den eigentlichen wert anzeigen.

Also z.b. Bit 1 Bit 3 Bit 5 ist dein wert zum rechnen
Bit 2 Bit 4 sind steuerbits, die mal so mal anders gesetzt sind, was du aber nciht zum rechnen brauchst

und deswegen must du ein & machen

sprich

0001010101 = alles an
0001110101 = alles an

obwohl verschieden kommt bei beiden das gleiche raus wenn es mit & 0001010101 geuntet wird.

also
0001010101
0001010101

0001010101
und
0001110101
0001010101

0001010101

aber
0000110101
0001010101

0000010101

klar :smile:, der rest ist warscheinlich nur noch eine konstante die mit reingerechnet werden muss um in deinem maassystem zu sein.

result=(result*5.)/1024.;

defenitiv gibt dir das ding wohl keine Volt in Volt zurück, sondern eine andere Maaseinheit, z.b. in interne milliNewton , wenn das geht :wink:

du müstes also erforschen was für eine einheit dir das 16Bit ding denn nun liefert. ist es z.b. von -5Volt bis +5Volt und das aufgelöst in ein integer von -16345345 bis +16345345 (beispiel nciht richtig), wenn es dann z.b. 888 liefert, musst du umrechnen was es den für ein wirkliches Volt ist :smile:

Danke für die Antwort. Also wird 10 in ein double umgewandelt.
Was passiert mit dem Ergebnis 2/10, ist es dann ein double?

Bei der Division von ganzahligen operatoren kommt wieder ein ganzahliger operator raus.

also 9/2 = 4 integer
also 9.0/2 = 3.5 typ double, da ein operant vom typ double
also 9/2. = 3.5 typ double, da ein operant vom typ double

klaro :wink:

result=(result*5.)/1024.;

denke es ist also in von 0…1 dargestellt in einem 16 bit = 1024

also 0 = 0 ; 1 = 1024

also / 1024 weil 1024 stücke gleich 1 ganzes sind
und * 5 damit wir bei 5 grad sind und nicht nur bei 1 Grad :smile:

also 0 = 0 ; 1 = 1024

also / 1024 weil 1024 stücke gleich 1 ganzes sind
und * 5 damit wir bei 5 grad sind und nicht nur bei 1 Grad :smile:

folglich gibt es wohl einen prozentualen wert an
von 0 bis 1 = 100%

und somit musst du umrechnen was 100% sind, 5*100% = 5 Volt :smile:

(* Maximalwert / Anzahl der Stufen)

genau

Stufen:
das 16Bit hat 1024 Stufen wo gleichmäßig die Zahlen von 0 bis 1 abbildet. also in 100%/1024 Prozentschritten (1/1024).
Maximalwert:
Der Maximalwert ist deine Einstellung das du bei 100% Ausschlag 5 Volt max hast , sprich deine Einstellung ist von 0 bis 5 Volt :smile:

die 10 Bits haben 1024 Stufen :wink:
Darin liegt der Wert binär vor. Ich hab gedacht, ich muss umrechnen da bei der Umwandlung von einer binären Zahl in Integer nicht automatisch gemacht wird. Aber so wie du es beschrieben hast, wird es schon sein. Trotzdem ist mir noch immer nicht ganz klar warum. Wie schaut die in Integer gecastete Zahl aus?

Grüße
Franz

PS: THX für deine Hilfe!

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

???

Ein Integer ist BINÄR
oder auch simple es sind 16 Bits

die auch genauso interpretiert werden.
2 hoch 16 also

wenn es den Bit wert liefert und du (int) machst, passiert ausser das wenn es das 16 bit gesetzt nichts, nur bei ausgaben wird daraus eine negative zahl erzeugt , passe ich meine Ausgabe an wird auch dann aus INT genauso ein grosser zahlen raum (bit kombinationen) wie eine UINT.

Bits bleiben aber Bits , double int float sind aber zur darstellung von ZAHLEN gedacht.

Also ist deine Logik unlogisch, du überlegst ob ein Integer ein BIT genauso wie ZAHLEN maniupuliert.

ein char z.b. hat ja auch nicht nur zeichen, also könnte man auch alle 8 Bits für die zahlen 0 bis 255 nehmen,
wenn ich allerdings ein char auf einer asccii tabelle anguge
so ist die nummer 64 mit einem A belegt, das steckt aber nicht im char , sondern in eienr Auswertung die die Tabelle ASCII mit den Zahlen 0-127 bzw 128-255 abbilde

die 10 Bits haben 1024 Stufen :wink:

was wird wohl aus

11 11 11 11 11 = 10 Bits

nun will ich 16 bits haben

also wohl

00 00 00 11 11 11 11 11 = 16 Bits

und bei 32 Bits

00 00 00 00 00 00 00 00 00 00 00 11 11 11 11 11 = 32 Bits

ale haben den gleichen Wert

umrechnen da bei der Umwandlung von einer binären Zahl in
Integer nicht automatisch gemacht wird. Aber so wie du es

??? wie du rechnest doch nix um, du nimmst doch eine & verknüpfung mit einer HEXZAHL for, das ist doch schon umgewandelt. bzw das was du in ADRR ist ist ein 16 bit wert, von dem 10Bits für die informationen sind, der rest wird immer aufgefüllt, durch deine Bit verknüpfung mit dem HEXWERT (16Bit wert , kleinste integer einheit (bzw 32 beim grösseren system)).

Ich denke Du hast ein grundlegendes Problem mit deiner Lektüre.

Estmal lesen was Bits sind, dann was ein Byte ist, und dann was Variablen sind und dann was ein TYP einer variablen ist.

http://de.wikipedia.org/wiki/Bit

in MASHINE CODE habe ich nicht integer, sondern register, mit denen ich das was der mensch eine Zahl nennt erzeuge. Ok ich hab eine verarbeitungs breite (16bit, 32bit) aber ob das was darin steht einen typ hat, ist nicht prozessor gesteuert, sondern menschen denke , um den prozess zu verstehen:smile:

Beispiel
2*2 wird im computer zu

00000010
+
00000010

00000100

das das nun 2+2=4 ist , kann aber auch anders sein, das ich nur mit negativen zahlen arbeite , dann wäre es ja

-2 + -2 = -4

damit man aber weiss ob es eine - oder + ist
hat mmensch sich entschieden das letzte Bit als vorzeichenbit zu nehmen

also
10000010
+
10000010

10000100

-2 + -2 = -4

da nun aber ein Bit weg ist, haben wir nur noch 7 bits also 2 hoch 7 möglchkeiten

macht also -127 bis 127

und es sind immernoch die geleichen Bits zur darstellung des absoluten wertes.