Forum: Mikrocontroller und Digitale Elektronik Formel-/Berechnungsprobleme


von __Son´s B. (bersison)


Lesenswert?

Hallo.
Ich bitte um Hilfe, komme mit meiner Logik nicht weiter;
1
uint16_t ZeitPoty_Vorwahl(void)
2
{
3
  uint32_t VorwahlZeit;
4
5
  VorwahlZeit = (2000*(400/400));     //  Soll=2000, Ist=2000
6
  VorwahlZeit = ((2000*400)/400);     // Soll=2000, Ist <100
7
  VorwahlZeit = (1980*400/1023+20);   // Soll=794.19, Ist <100
8
9
  return(VorwahlZeit);
10
}
Warum kommt bei Formel 2,3 nicht die korrekte Zahl raus?

PS:
Prog.Sprache: C
uC: ATMEL ATtiny84
Zahlen innerhalb der Formel sind in Echt, Variable und 
Präprozessor-Makro.
Fehler liegt eindeutig innerhalb des Formelaufbaus!

Beitrag #5562477 wurde von einem Moderator gelöscht.
von STK500-Besitzer (Gast)


Lesenswert?

c-hater schrieb im Beitrag #5562477:
> Das ist dein Problem. C ist Scheisse. Du hast nur keine Ahnung, wie
> Scheisse genau C ist. Dazu müsstest du C beherrschen. Tust du aber
> offensichtlich nicht...
>
> Wäre das allerdings der Fall, könntest du trotz aller C-Idiotie in C
> tatsächlich das erreichen, was du willst. Du müsstest halt nur lernen,
> wie man das in C korrekt formuliert...

Blablabla...
1980*400 ist schon mal größer als die größte Zahl, die in uint16_t 
passt.
Und Nachkommastellen kann INTEGER sowieso nicht.

Beitrag #5562497 wurde von einem Moderator gelöscht.
von S. R. (svenska)


Lesenswert?

__Son´s B. schrieb:
> Fehler liegt eindeutig innerhalb des Formelaufbaus!

Schreibe mal "2000UL" statt "2000".

von Forist (Gast)


Lesenswert?

__Son´s B. schrieb:
> Zahlen innerhalb der Formel sind in Echt

Kannst du mal versuchen, diese Aussage allgemeinverständlich zu 
formulieren?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

STK500-Besitzer schrieb:
> Blablabla...
> 1980*400 ist schon mal größer als die größte Zahl, die in uint16_t
> passt.

 Noch ein Beweis das C Mist ist:
1
uint32_t VorwahlZeit;

 VorwahlZeit ist als uint32 deklariert, mit VorwahlZeit und vollen
 32 bit soll gerechnet werden, am Ende sollen die niederen 2 Bytes
 als uint16 zurückgegeben werden.

 Alles andere ist Mist, Fehlerhaft und dumm.
 Aber das ist C sowieso...

von S. R. (svenska)


Lesenswert?

Marc V. schrieb:
> Aber das ist C sowieso...

Geh weg und nutz was anderes.
C hat gewisse Eigenschaften, wie jede andere Programmiersprache auch, 
und wenn du nicht willens bist, diese zu erlernen, dann solltest du die 
Nutzung auch unterlassen.

: Bearbeitet durch User
Beitrag #5562601 wurde von einem Moderator gelöscht.
von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

S. R. schrieb:
> Geh weg und nutz was anderes.
 Tue ich meistens auch.


> C hat gewisse Eigenschaften, wie jede andere Programmiersprache auch,
 Eigenschaften unterscheiden sich aber von Blödheit und Idiotie.

> und wenn du nicht willens bist, diese zu erlernen, dann solltest du die
> Nutzung auch unterlassen.

 Was hat erlernen damit zu tun?
 Ich habe es erlernt, muss ich deswegen mit jeder Dummheit einverstanden
 sein ?

 Wenn ich eine Variable als 32 bit deklariert habe, mit dieser aber nur
 bis 16 bit rechnen kann, dann ist das für mich mehr als Blödheit - es
 ist Idiotie.

 Punkt.

von S. R. (svenska)


Lesenswert?

c-hater schrieb im Beitrag #5562601:
> C ist einfach...
Ja.

> C ist portabel...
Ja.

Aber:

> Programmieren ist einfach.
Nein.

> Portabel programmieren ist einfach.
Nein.

von Wolfgang (Gast)


Lesenswert?

Wie blöd muss eine Programmiersprache sein, damit sie bei den oben 
gezeigten Beispielen einer 32-Bit Variablen keine sinnvolle Zahl 
zuweist?

Da merkt man, das C eine Sprache ist, die durch Bastelei über inzwischen 
mehr als 45 Jahre immer wieder an die Entwicklung der Computertechnik 
angepasst wurde und manchen Anachronismus mit sich rum schleppt.

von c-hater (Gast)


Lesenswert?

S. R. schrieb:
> c-hater schrieb im Beitrag #5562601:

>> Programmieren ist einfach.
> Nein.
>
>> Portabel programmieren ist einfach.
> Nein.

Du bist ein Zitatfälscher. Nichts von dem angeblich zitierten Text 
stammt von mir.

Nunja, derzeit kann das noch jeder selber nachlesen, aber dank der 
Zensur kann man sich ja leider nicht darauf verlassen, dass das auch so 
bleiben wird. Also möchte ich hier noch einmal ausdrücklich darauf 
hingewiesen haben...

von __Son´s B. (bersison)


Lesenswert?

Also - mir ist es egal was der Eine oder Andere von C hält!
Solch sinnfreie Diskussionen bitte anderweitig führen.

Tatsächlch benötige ich als "return" keine Dezimalstellen.
Deklaration uint32_t habe ich nur benutzt, da der Wert innerhalb der 
Formel auf 800 000 kommen kann.
Das Ergebins der Formal kann nie über 2 000 kommen - daher uint16_t.

von c-hater (Gast)


Lesenswert?

__Son´s B. schrieb:

> Also - mir ist es egal was der Eine oder Andere von C hält!

Das sollte dir auch egal sein.

> Solch sinnfreie Diskussionen bitte anderweitig führen.

Sinnfrei war die Diskussion nicht. Du bist nur zur unwissend, um deinen 
Fehler zu erkennen, OBWOHL er im Laufe selbiger, direkt und indirekt, 
mehrfach erwähnt wurde...

Sprich: du bist nicht nur von weitestgehender C-Unkenntnis geplagt, 
sondern obendrein vom völligen Unvermögen des verstehenden Lesens. 
Gaaanz schlechte Voraussetzungen für einen Programmierer, denn es hält 
ihn davon ab, hinzuzulernen. Was allerdings Grundvoraussetzung ist, um 
jemals wirklich Programmierer zu werden, ganz egal in welcher Sprache. 
Tatsache ist: wirkliche Programmierer können in jeder Sprache 
programmieren. Weil sie schlicht in der Lage sind, die Konzepte jeder 
Sprache zu verstehen und daraus die Einschränkungen der Sprache ableiten 
können. Sprich: der Kern eines guten Programmierers ist: logisch denken 
zu können und zu Abstraktionen fähig zu sein. Das ist zwingend nötig für 
die Umsetzung des Problems, genauso zwingend aber für die kompetente 
Nutzung des zur Umsetzung verwendeten Werkzeugs, also der Sprache und 
der Toolchain.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

c-hater schrieb:
> Sprich: du bist nicht nur von weitestgehender C-Unkenntnis geplagt,

Das bist in erster Linie Du, sonst würdest Du nicht Deinen Hass überall 
ungefragt auskippen.

Lass das doch einfach mal bleiben. Ist ja nicht so, daß man Dir das noch 
nie nahegelegt hätte.

von Wolfgang (Gast)


Lesenswert?

__Son´s B. schrieb:
> Tatsächlch benötige ich als "return" keine Dezimalstellen.
> Deklaration uint32_t habe ich nur benutzt, da der Wert innerhalb der
> Formel auf 800 000 kommen kann.

Das interessiert C aber bei der Berechnung erstmal nicht. Für die 
Berechnung gilt nur, was auf der rechten Seite steht. Wenn du Konstanten 
vom Datentyp long verwenden würdest, würde die Rechnung mit 32 Bit 
ausgeführt werden, aber so nicht.

von Wolfgang (Gast)


Lesenswert?

Wolfgang schrieb:
> ... Datentyp long ...

Bei der Formulierung hätte ich aus dem Lager der C Anhänger schon längst 
Geschimpfe erwartet ...

Beitrag #5562786 wurde vom Autor gelöscht.
von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Wolfgang schrieb:
> __Son´s B. schrieb:
>> Tatsächlch benötige ich als "return" keine Dezimalstellen.
>> Deklaration uint32_t habe ich nur benutzt, da der Wert innerhalb der
>> Formel auf 800 000 kommen kann.
>
> Das interessiert C aber bei der Berechnung erstmal nicht. Für die
> Berechnung gilt nur, was auf der rechten Seite steht. Wenn du Konstanten
> vom Datentyp long verwenden würdest, würde die Rechnung mit 32 Bit
> ausgeführt werden, aber so nicht.

 Ja, sicher.
 ulong = 8bit * 8bit ergibt auch nur 8 bit oder wie ?

von __Son´s B. (bersison)


Lesenswert?

Marc V. schrieb:
> Das interessiert C aber bei der Berechnung erstmal nicht. Für die
>> Berechnung gilt nur, was auf der rechten Seite steht. Wenn du Konstanten
>> vom Datentyp long verwenden würdest, würde die Rechnung mit 32 Bit
>> ausgeführt werden, aber so nicht.
>
>  Ja, sicher.
>  ulong = 8bit * 8bit ergibt auch nur 8 bit oder wie ?

Nun habe ich aus lauter Verzweiflung mit übertriebenen Datentypen rum 
experimentiert, aber keinen Fortschritt erfahren...
1
double ZeitPoty_Vorwahl(void)
2
{
3
  double VorwahlZeit;
4
5
  //VorwahlZeit = (2000*(400/400)); // klappt
6
  //VorwahlZeit = ((2000*400)/400);  //fehler
7
  VorwahlZeit = (1980*2000/1023+20); //fehler
8
  
9
  return(VorwahlZeit);
10
}
Tatsächlich brauche ich hier eine konkrete und praktische Lösungen --- 
jemand der mich ans Händchen nimmt ;-(

von Keiner N. (nichtgast)


Lesenswert?

Dein Problem ist nicht die größe deiner Variable, sondern der Datentyp 
der Konstanten.

Versuch doch mal

(2000ul*400)/400

das sogt dafür, das der compiler mit usigned long rechnet statt mit int.

Bei deiner ersten Rechnung rechnet er ja erst mal die 400/400 aus. Das 
ist natürlich 1 und 2000/1 bleibt halt 2000

bei den anderen rechnet er erst mal 2000*400/1980*2000. Dieses Ergebnis 
sprengt den Wertebereich von int auf dem Atmel. Dadurch wird der nächste 
Schritt auch nicht richtig ausgeführt.

von Programmiersprachentheaterintendant (Gast)


Lesenswert?

Hausaufgaben in C:
Definiere eine vorzeichenlose ganzzahlige Konstante oder ein Makro mit 
Wert Dreitausendeinhunderteinundvierzig, sie soll unbesehen und 
uneingeschränkt tauglich sein um in 16bit, 32bit, 64bit Berechnungen und 
Zuweisungen sorgenfrei verwendbar sein.
Zusatzaufgabe: Cutti aber auch für gemischt signed/unsigned.

Beispiele: siehe Eröffnungspost, sie soll den Platz der Zahl "2000" 
einnehmen, ohne die im Eröffnungspost beklagten Nachteile zu 
verursachen.

von __Son´s B. (bersison)


Lesenswert?

Keiner N. schrieb:
> Dein Problem ist nicht die größe deiner Variable, sondern der Datentyp
> der Konstanten.
>
> Versuch doch mal
>
> (2000ul*400)/400
>
> das sogt dafür, das der compiler mit usigned long rechnet statt mit int.

DANKE, das ist das Problem!
War mir nicht mehr auf dem Schirm, dass eine undeklarierte Zahl erst 
einmal von "int" aus geht.

Gibt es eine Möglichkeit, alle Zahlen die innerhalb des Codes auftauchen 
könnten (schon im Kopfbereich) als "unsigned long" oder "float" zu 
deklarieren?

von __Son´s B. (bersison)


Lesenswert?

Macros wurden in der Formel erst einmal durch Ganzzahlen ersetzt um den 
Fehler einzukreisen und das Prinzip zu verstehen.

Tatsächlich wurden Macros eingesetzt - Klappt gut.

Definition jedes einzelnen Wertes finde ich aber Umständlich und 
Fehleranfällig.
Kennt ihr hierzu eine plausible Lösung ohne auf Macros zu verzichten?
1
#define POTY_ZEIT_MIN (20ul)
2
#define POTY_ZEIT_MAX (2000ul)
3
#define POTY_ZEIT_BEREICH (POTY_ZEIT_MAX - POTY_ZEIT_MIN)
4
...
5
uint32_t ZeitPoty_Vorwahl(void)
6
{
7
  uint32_t VorwahlZeit;
8
  VorwahlZeit = (POTY_ZEIT_BEREICH * SpgUeberwach_Mittelwert(POTY_ZEIT_PORT) / 1023 + POTY_ZEIT_MIN);
9
  return(VorwahlZeit);
10
}

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

__Son´s B. schrieb:
> Kennt ihr hierzu eine plausible Lösung ohne auf Macros zu verzichten?

 Sprache wechseln, etwas für normale Menschen benutzen.
 Wenn ich alles erst selber ausrechnen und danach auf Richtigkeit prüfen
 muss, ist mit der Sprache etwas nicht in Ordnung.

Keiner N. schrieb:
> Versuch doch mal
>
> (2000ul*400)/400
>
> das sogt dafür, das der compiler mit usigned long rechnet statt mit int.

 Ja, aber nur in C.
 Ansonsten wird immer mit soviel bits gerechnet wie die deklarierte
 Variable hat.
 2000 ist 11 bit, 16bit reichen also vollkommen für die Deklaration aus.
 Warum soll es mit ul deklariert werden ?

 Weil C eine logische Sprache ist oder weil C ein Haufen von
 zusammengewürfelten Fehldeklarationen ist ?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Marc V. schrieb:
> Sprache wechseln, etwas für normale Menschen benutzen.

Dein Sprachgebashe kannst Du gerne woanders ausüben. Wenn Du nichts 
tatsächlich hilfreiches beizutragen hast, sind Deine Kommentare genauso 
überflüssig wie die von dem anderen selbsternannten Sprachkritiker hier.

von Wolfgang (Gast)


Lesenswert?

__Son´s B. schrieb:
> Gibt es eine Möglichkeit, alle Zahlen die innerhalb des Codes auftauchen
> könnten (schon im Kopfbereich) als "unsigned long" oder "float" zu
> deklarieren?

Zwischen "unsigned long" oder "float" liegen Welten.

Sowohl Dynamikbereich als auch Anzahl der Stellen (als auch Codegröße 
auf µC ohne FPU) unterscheiden sich um Welten. Was willst du genau?

von __Son´s B. (bersison)


Lesenswert?

Wie beschrieben geht es mir um eine generelle "Grunddeklaration", statt 
"int" wenn nicht deklariert wird.
Speicherplatz und Prozessorgeschwindigkeiten spielen für mich aktuell 
keine Rolle. Daher mein Bsp "unsigned long", "float".

von Arno (Gast)


Lesenswert?

Du könntest die Makros durch Konstanten ersetzen. Die haben einen 
Datentyp.

Also statt
1
#define POTY_ZEIT_MIN (20ul)

schreibst du:
1
const unsigned long POTY_ZEIT_MIN = 20;

oder du verwendest gleich die Datentypen mit definierten Längen:
1
#include <stdint.h>
2
const uint32_t POTY_ZEIT_MIN = 20;

Denn anders als behauptet entwickelt sich C sehr wohl weiter, man muss 
nicht immer mit den Einschränkungen von K&R C oder C89 arbeiten, sondern 
kann durchaus C99 oder C11 verwenden...

MfG, Arno

von S. R. (svenska)


Lesenswert?

__Son´s B. schrieb:
> Wie beschrieben geht es mir um eine generelle "Grunddeklaration", statt
> "int" wenn nicht deklariert wird.

Schlecht, denn dann ist das Verhalten eines Codeabschnitts nicht mehr 
lokal vorhersagbar. Kurz: Ich lese den Code und habe keine Ahnung, was 
eigentlich passiert.

__Son´s B. schrieb:
> Speicherplatz und Prozessorgeschwindigkeiten spielen für mich aktuell
> keine Rolle.

Dann nimm Java, Javascript oder ähnliche Sprachen. Dort ist das so.

von __Son´s B. (bersison)


Lesenswert?

Arno schrieb:

> Also statt
>
1
> #define POTY_ZEIT_MIN (20ul)

> schreibst du:
>
1
> const unsigned long POTY_ZEIT_MIN = 20;

> oder du verwendest gleich die Datentypen mit definierten Längen:
>
1
> #include <stdint.h>
2
> const uint32_t POTY_ZEIT_MIN = 20;
DANKE Arno!

S. R. schrieb:
> Dann nimm Java, Javascript oder ähnliche Sprachen. Dort ist das so.

Danke, aber zu spät - keine Zeit für Neuanfang!

von Wolfgang (Gast)


Lesenswert?

__Son´s B. schrieb:
> Wie beschrieben geht es mir um eine generelle "Grunddeklaration", statt
> "int" wenn nicht deklariert wird.

Verwende VISUAL BASIC und den Variablentyp VARIANT

von S. R. (svenska)


Lesenswert?

__Son´s B. schrieb:
>> Dann nimm Java, Javascript oder ähnliche Sprachen. Dort ist das so.
> Danke, aber zu spät - keine Zeit für Neuanfang!

Dann merk dir das für später.

Die Antwort auf deine Frage hatte ich übrigens schon sehr früh gegeben, 
du hast sie nur ignoriert. :-(

von c-hater (Gast)


Lesenswert?

Rufus Τ. F. schrieb:

> c-hater schrieb:
>> Sprich: du bist nicht nur von weitestgehender C-Unkenntnis geplagt,
>
> Das bist in erster Linie Du

Ist das so? Mir scheint hingegen, ich hätte das Problem korrekt 
identifiziert. Oder kannst du irgendwelche FAKTEN anführen, die dieser 
Einschätzung widersprechen?

> Lass das doch einfach mal bleiben. Ist ja nicht so, daß man Dir das noch
> nie nahegelegt hätte.

Tja, die Sache ist halt die: die FAKTEN habe sich in den letzten knapp 
50 Jahren einfach nicht geändert. Deswegen werde ich sie natürlich 
weiterhin zur Argumentation verwenden. Ob dir das nun passt oder nicht.

Übrigens halte ich deine Verweigerungshaltung bei der Zurkenntnissnahme 
objektiver Fakten (obendrein in deinem Fall: ganz offensichtlich wider 
besseren eigenen Wissens) für überaus tendenziös. Das kann und darf man 
nicht unwidersprochen lassen, wenn man sich der objektiven Wahrheit 
verpflichtet fühlt.

Sprich: sobald du (und die anderen C-only-Jünger) sich zur korrekten 
Darstellung der objektiven Wahrheit durchringen, bist du mich auch 
sofort los. ;o)

Ist doch absolut easy oder nicht?

von STK500-Beistzer (Gast)


Lesenswert?

c-hater schrieb:
> Sprich: sobald du (und die anderen C-only-Jünger) sich zur korrekten
> Darstellung der objektiven Wahrheit durchringen, bist du mich auch
> sofort los. ;o)

In wie viele Sprachen hast du denn schon reingeguckt?
Wieso ist C (im Embedded-Bereich) so verbreitet?
Welche Fakten hast du genannt?
Die sind mir wohl durch dein Rumgebölke entgangen.

Wenn du einen schlechten Tags hast/hattest: Lauf ne Runde um Block, aber 
lass deinen Frust nicht an anderen aus.

von Experte (Gast)


Lesenswert?

1
main.c: In function ‘ZeitPoty_Vorwahl’:
2
main.c:9:23: warning: integer overflow in expression [-Woverflow]
3
   VorwahlZeit = ((2000*400)/400);     // Soll=2000, Ist <100
4
                       ^
5
main.c:10:22: warning: integer overflow in expression [-Woverflow]
6
   VorwahlZeit = (1980*400/1023+20);   // Soll=794.19, Ist <100

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

STK500-Beistzer schrieb:
> Welche Fakten hast du genannt?

Experte schrieb:
1
 main.c: In function ‘ZeitPoty_Vorwahl’:
2
 main.c:9:23: warning: integer overflow in expression [-Woverflow]
3
    VorwahlZeit = ((2000*400)/400);     // Soll=2000, Ist <100
4
                     ^

 Warum wird auf 16 bit Überlauf gewarnt ?
 Es soll überhaupt nicht gewarnt werden und es soll mit vollen
 32 bit gerechnet werden weil VorwahlZeit als 32 bit deklariert ist.

 Alles andere ist ein riesengroßer Fehler.

 Morgen werden vielleicht uC mit 64 oder 128 bit üblich sein, wird
 dann immer noch munter mit 16 bit und Überlauf gerechnet werden ?

 Die linke Seite bestimmt immer welches Format das Resultat hat.

 Ist es so schwer zu verstehen ?

 Aber nein, hier wird stur C verteidigt, trotz offensichtlicher
 Fehler.

 Was noch schlimmer ist, jeder der etwas gegen C sagt, wird sofort von
 der C Gemeinde (wovon die meisten wenig oder überhaupt keine Ahnung
 von C haben) sofort angegriffen und angespuckt.

 Warum ?

 Weil die meisten im Grunde wissen, dass es ein Fehler ist, aber selber
 nicht genug Ahnung davon haben, um es verteidigen zu können und da
 ist mitschwimmen mit der Mehrheit die beste Möglichkeit, etwas zu
 sagen, auch wenn diese "Experten" nichts zu sagen haben oder gar nicht
 wissen, wovon sie reden.

: Bearbeitet durch User
von S. R. (svenska)


Lesenswert?

Marc V. schrieb:
> Alles andere ist ein riesengroßer Fehler.

Nein, alles andere ist ein Fehler in deiner Annahme über die 
Funktionsweise. Jeder Ansatz hat Grenzen und Einschränkungen, und jede 
Lösung besteht aus Kompromissen.

Marc V. schrieb:
> Die linke Seite bestimmt immer welches Format das Resultat hat.

Die linke Seite bestimmt das Format des Ergebnisses, nicht aber das 
Format möglicherweise auftretender Zwischenergebnisse. Du kannst das 
Thema ja mal mit Fließkommazahlen durchspielen.

Marc V. schrieb:
> Ist es so schwer zu verstehen ?

Nein, aber ich fürchte, mit dem Thema "Rundungsungenauigkeiten" bist du 
ebenfalls überfordert.

Marc V. schrieb:
> Aber nein, hier wird stur C verteidigt,
> trotz offensichtlicher Fehler.

Das, was du als Fehler betrachtest (nämlich "int" als Maßstab), ist ein 
Kompromiss aus einer Zeit, in der du vermutlich noch nichtmal gelebt 
hast. Du darfst jetzt wie ein kleines Kind auf und nieder stampfen, 
brüllen, schreien und heulen, aber die Entscheidung ist nunmal gefallen.

Du darfst dafür argumentieren, dass man das gefälligst jetzt schleunigst 
ändern sollte. Dafür gibt es ebenfalls gute Gründe, Kompatiblität mit 
existierendem Code gehört allerdings nicht dazu.

Schau dich in der Welt um, wieviel Scheiße aus Kompatiblitätsgründen 
existiert. Vielleicht merkst du dann, dass es manchmal gute Gründe gibt, 
mäßig gute Entscheidungen weiter zu tragen, statt sie mit Gewalt zu 
ersetzen.

Beispiele wären gewisse Teile von POSIX, einige Teile von Windows, an 
sich das gesamte Bankensystem (inklusive nächtlicher Batchprozesse), 
oder die Reisesysteme (egal ob Flug- oder Schiffsreisen). Auch deine 
Schuh- und Hosengrößen, oder die imperialen Gewinde der Schrauben in 
deinen Gehäusen sind historisch gewachsene Kompatiblitätsschrotthaufen. 
Und so geht es weiter, vom Kleinen bis zum Großen und wieder zurück.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

S. R. schrieb:
> Die linke Seite bestimmt das Format des Ergebnisses, nicht aber das
> Format möglicherweise auftretender Zwischenergebnisse.

 Und gerade das ist ein Fehler.
 Ich kann 8 bit mit 8 bit multiplizieren, das Ergebnis kann nicht
 grösser als 16 bit sein, aber wenn das Resultat einer 32 bit Variablen
 zugewiesen werden soll, dann stelle ich auch 32 bit für
 Zwischenergebnisse bereit und nicht stur 16 bit.


> Du darfst dafür argumentieren, dass man das gefälligst jetzt schleunigst
> ändern sollte. Dafür gibt es ebenfalls gute Gründe, Kompatiblität mit
> existierendem Code gehört allerdings nicht dazu.

 Natürlich nicht, aber Kompatibilität mit zukünftigem Code schon.

 Ich will nicht in 20 Jahren immer noch überlegen ob Zwischenergebnisse
 in 16 bit, 32 bit, 64 bit oder 8 bit bereitstehen, warum auch ?
 Ich will (wie es normal ist), dass Zwischenergebnisse mindestens
 soviel bits haben wie das Resultat auch.

> Schau dich in der Welt um, wieviel Scheiße aus Kompatiblitätsgründen
> existiert.

 Ja, aber den meisten von uns ist britische oder amerikanische
 Schuh- oder Hosengröße so was von egal weil es Umrechnungstabellen
 dafür gibt.

 Wenn aber in irgendeiner dieser Umrechnungstabellen die falsche
 Größe drinstehen würde, wäre das eine ganz andere Sache...

von S. R. (svenska)


Lesenswert?

Marc V. schrieb:
>> Die linke Seite bestimmt das Format des Ergebnisses, nicht aber das
>> Format möglicherweise auftretender Zwischenergebnisse.
>
>  Und gerade das ist ein Fehler.

Warum? Weil dein Tellerrand zu hoch ist?

Du kannst 32 Bit durch 16 Bit dividieren und den Rest der Berechnungen 
mit 16 Bit durchführen. Wozu 16 Bit verschwenden, wenn es teuer ist?

Du kannst ein paar Double-Berechnungen durchführen und das Ergebnis in 
einem Minifloat speichern. Sollte die ganze Berechnung jetzt als 
Minifloat stattfinden, weil das Ergebnis ein Minifloat ist?

Du fluchst und stampfst und schreist, aber deine Lösung hat die selben 
Probleme an anderen Stellen. Du bist der Ingeneur, der einfach dickere 
Schrauben nimmt, ohne zu bemerken, dass die Wand das Gewicht trotzdem 
nicht trägt.

Marc V. schrieb:
>> Dafür gibt es ebenfalls gute Gründe, Kompatiblität mit
>> existierendem Code gehört allerdings nicht dazu.
>
> Natürlich nicht, aber Kompatibilität mit zukünftigem Code schon.

Die Existenz von zukünftigem Code ist nicht garantiert, die Existenz von 
existierendem Code per Konstruktion schon.

Ich weiß, dass jetziger Code unter jetzigen Annahmen funktioniert. 
Wenn ich an den Annahmen spiele, mache ich damit möglicherweise etwas 
kaputt und die Kosten dieser Zerstörungswut sind höher als der 
mittelfristige Nutzen.

Langfristig ist es egal, weil der Code irgendwann unter neuen Annahmen 
neu geschrieben wird. Dabei ist auch ein Wechsel der Programmiersprache 
kein Problem mehr.

Kurz:
- kurzfristig: Friss, was zu fressen da ist und halt Schnauze.
- mittelfristig: Friss. Wenn's dir nicht schmeckt, dann bau dir einen 
Garten und friss trotzdem, sonst verhungerst du bis zur Ernte.
- langfristig: Ist doch egal, was es zu fressen gibt, bist doch Veganer.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Marc V. schrieb:
> Die linke Seite bestimmt immer welches Format das Resultat hat.

Nicht in C. Da hat man sehr viel präziseren Einfluss darauf, wie 
gerechnet werden soll.
1
int a;
2
int b;
3
float c;
4
5
a = 2;
6
b = 3;
7
8
c = a * b;

Nach Deiner Sichtweise müsste hier eine float-Multiplikation 
durchgeführt werden.

Genau das aber macht C nicht. Man kann es dazu zwingen, eine 
float-Multiplikation durchzuführen (mit einem typecast eines der 
Operatoren).


> Und gerade das ist ein Fehler.

Nein. Es ist einfach so, daß mit der nativen Wortgröße gerechnet wird, 
solange nicht einer der Operatoren eine andere Größe festlegt.

Was auf der anderen Seite des Zuweisungsoperators steht, hat auf die 
Berechnung keine Auswirkung.

Das ist eine grundlegende Spracheigenschaft, und darauf kann man sich 
verlassen.

Diese Spracheigenschaft nicht zu verstehen, das ist ein Fehler.


> Morgen werden vielleicht uC mit 64 oder 128 bit üblich sein, wird
>  dann immer noch munter mit 16 bit und Überlauf gerechnet werden ?

Natürlich nicht, auf einem 64-Bit-µC wird die native Wortgröße dann 64 
Bit betragen. Oder 32, wozu auch immer der Compilerbauer Lust und Laune 
hat, und was sich anbietet.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Marc V. schrieb:
> Morgen werden vielleicht uC mit 64 oder 128 bit üblich sein, wird
>  dann immer noch munter mit 16 bit und Überlauf gerechnet werden ?
Das selbe Programm heute für ein 32-Bit System z.B. STM32 oder einen 
PC compiliert würde wie hier erwartet mit long berechnet werden.

Ich möchte nicht, dass auf einem 8-Bit System jede Berechnung mit long 
durchgeführt wird. Ich möchte auch nicht, dass der Compiler solche Sache 
ln nach Gutdünken "automatisch" heute so und morgen anders macht.

Das ist übrigens das "Systemverständnis", das ich im 
Beitrag "Re: Als Informatiker in Embedded gehen?" vorhin erwähnt 
habe: man muss seine Toolchain kennen, damit was Sinnvolles rauskommt.

: Bearbeitet durch Moderator
von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Rufus Τ. F. schrieb:
1
a = 2;
2
b = 3;
3
4
c = a * b;
> Nach Deiner Sichtweise müsste hier eine float-Multiplikation
> durchgeführt werden.

 Nein.
 Multiplikation zwei Integerzahlen kann niemals einen float
 erfordern. Casten zum Schluss reicht vollkommen.

 Aber:
1
a = 2;
2
b = 3;
3
4
c = a / b;
 Hier soll eine float-Division durchgeführt werden und das ist logisch
 und wäre auch so zu erwarten.

 Demgegenüber:
1
a = 20;
2
b = 3;
3
4
b = a / b;
 Hier soll natürlich in integer gerechnet werden und dann kann der
 Integer hier so breit sein, wie von der Sprache definiert, es stört
 keinen normalen Menschen und es wird auch so erwartet.

 In allen 3 Fällen aber stur mit 16 bit zu rechnen ist auf jeden Fall
 falsch.
 Und auch wenn morgen die übliche Registerbreite 32 oder 64bit wird
 und dann mit soviel bits gerechnet wird, ist es immer noch falsch.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Lothar M. schrieb:
> Ich möchte nicht, dass auf einem 8-Bit System jede Berechnung mit long
> durchgeführt wird.
 Jetzt ist es ist aber so, ob du es wahrhaben willst oder nicht.
 Jede Berechnung wird mit 16 bit durchgeführt.


> Ich möchte auch nicht, dass der Compiler solche Sache
> ln nach Gutdünken "automatisch" heute so und morgen anders macht.
 Nicht nach Gutdünken, sondern nach gefordertem Format.

von S. R. (svenska)


Lesenswert?

Zusammengefasst willst du also inkonsistente, schwer verständliche 
Regeln haben, weil sie dir im Augenblick sinnvoll erscheinen.

Wie sieht das mit Zwischenergebnissen in Ausdrücken wie "a + (b + c * d) 
/ e - f" aus? Wandelst du da ständig zwischen Float und Integer umher 
oder soll alles mit der maximal möglichen Bitbreite (also __int128 oder 
quadfloat) berechnet werden?

Wie sieht das mit Rundungsungenauigkeiten aus, die man bei "float" vs 
"double" und insbesondere bei Minifloats bekommt? Hast du dir da mal 
Gedanken gemacht?

C besteht aus einfachen Regeln. Deswegen kann man einen Compiler in ein 
paar zig KB bauen. Offensichtlich magst du lieber komplizierte Regeln, 
die vom dynamisch vom Anwendungsfall abhängen, je nachdem, was du gerade 
möchtest.

Gehe zu Scriptsprachen. Am besten denen, wo '=', '==' und '===' 
unterschiedliches Verhalten zeigen, aber keines davon logisch ist. 
Vielleicht gefällt's dir da besser.

Marc V. schrieb:
> In allen 3 Fällen aber stur mit 16 bit zu rechnen
> ist auf jeden Fall falsch.

Es wird ja nicht immer stur mit 16 Bit gerechnet.
Das ist eine Fehlinformation.

: Bearbeitet durch User
von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

S. R. schrieb:
> Wie sieht das mit Zwischenergebnissen in Ausdrücken wie "a + (b + c * d)
> / e - f" aus?

 Und wie sieht es jetzt bei dir aus ?


> Wandelst du da ständig zwischen Float und Integer umher
> oder soll alles mit der maximal möglichen Bitbreite (also __int128 oder
> quadfloat) berechnet werden?

 Wie schon mehrmals gesagt, es soll mit gefordertem Format gerechnet
 werden und ob float oder integer das muss nur bei der Division
 wirklich beachtet werden.


 Aber was hat das alles überhapt damit zu tun, daß 32 bit gefordert
 sind, aber nur mit  16 bit gerechnet wird ?


 Das ist es was ich oben schon sagte - Wehe, jemand wagt es, überhaupt
 daran zu denken, C hätte irgendwelche Fehler...

von S. R. (svenska)


Lesenswert?

Marc V. schrieb:
> Aber was hat das alles überhapt damit zu tun, daß 32 bit gefordert
> sind, aber nur mit  16 bit gerechnet wird ?

C rechnet nicht grundsätzlich mit 16 Bit. Du bist falsch informiert.

Marc V. schrieb:
> Das ist es was ich oben schon sagte - Wehe, jemand wagt es, überhaupt
> daran zu denken, C hätte irgendwelche Fehler...

Alles Geisterfahrer außer deiner Wenigkeit. Is kla.

Hättest du mal gelesen, was ich oben schrieb. Aber du willst nur einen 
c-hater machen und geifern. Nungut, reicht mit.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

S. R. schrieb:
> Marc V. schrieb:
>> Aber was hat das alles überhapt damit zu tun, daß 32 bit gefordert
>> sind, aber nur mit  16 bit gerechnet wird ?
>
> C rechnet nicht grundsätzlich mit 16 Bit. Du bist falsch informiert.
>
> Marc V. schrieb:
>> Das ist es was ich oben schon sagte - Wehe, jemand wagt es, überhaupt
>> daran zu denken, C hätte irgendwelche Fehler...
>
> Alles Geisterfahrer außer deiner Wenigkeit. Is kla.
>
> Hättest du mal gelesen, was ich oben schrieb. Aber du willst nur einen
> c-hater machen und geifern. Nungut, reicht mit.

 Ja sicher.
 So etwas nennt man straw man argument

Experte schrieb:
>
1
> main.c: In function ‘ZeitPoty_Vorwahl’:
2
> main.c:9:23: warning: integer overflow in expression [-Woverflow]
3
>    VorwahlZeit = ((2000*400)/400);     // Soll=2000, Ist <100
4
>                        ^
5
> main.c:10:22: warning: integer overflow in expression [-Woverflow]
6
>    VorwahlZeit = (1980*400/1023+20);   // Soll=794.19, Ist <100
7
>

__Son´s B. schrieb:
> Warum kommt bei Formel 2,3 nicht die korrekte Zahl raus?

 Weil mit 16 bit gerechnet wird.

 Vielleicht erklärt das jemand dem Geisterfahrer S.R.

 P.S.
 Selbstverständlich benutze ich auch C und denke nicht, dass es die
 schlechteste Sprache ist.
 Aber Fehler sind Fehler, egal in welcher Sprache.
 TP4 hatte einen ähnlichen aber Borland hat es wenigstens zugegeben
 und es korrigiert.

: Bearbeitet durch User
von S. R. (svenska)


Lesenswert?

Marc V. schrieb:
> Vielleicht erklärt das jemand dem Geisterfahrer S.R.

Falls es dir entgangen sein sollte... ich habe die Lösung des Rätsels 
schon gaaanz weit oben gepostet.

Und ich habe dir versucht zu erklären, dass dein "das ist ein Fehler; 
das ist falsch; das ist böse" nicht stimmt. Dass da ein Sinn hinter 
steht. Dass dein Lösungsvorschlag auch nicht besser ist, sondern nur 
anders.

Interessiert dich nicht.

Du geilst dich an 16 Bit auf.

Wie immer halt. Alles Geisterfahrer außer du.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

S. R. schrieb:
> Marc V. schrieb:
>> Vielleicht erklärt das jemand dem Geisterfahrer S.R.
>
> Falls es dir entgangen sein sollte... ich habe die Lösung des Rätsels
> schon gaaanz weit oben gepostet.

 Nein, hast du nicht, du hast ihm nur einen Weg gezeigt, wie dieser
 Fehler umgangen werden kann.

 Die Lösung des Rätsels ist immer noch:
 Es wird mit 16 bit anstatt mit geforderten 32 bit gerechnet.


> Du geilst dich an 16 Bit auf.
 Nein, aber es war diesmal tatsächlich der Fehler welchen der TO
 gesucht hat.


> Wie immer halt. Alles Geisterfahrer außer du.

 Wenn du meinst.
 OK.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Marc V. schrieb:
> Es wird mit 16 bit anstatt mit geforderten 32 bit gerechnet.
Ein "=" in C ist kein "Forderungszeichen", sondern eine Zuweisung. Und 
diese Zuweisung wird nach der Berechnung gemacht. Wenn du eine 
Berechnung mit 32 Bit Breite forderst, dann muss mindestens 1 Variable 
diese Breite haben. Das ist dann eine Forderung.

So ist es halt in C. Bei anderen Sprachen mag das anders sein...

von Beobachter (Gast)


Lesenswert?


von Beobachter (Gast)


Lesenswert?


von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Lothar M. schrieb:
> Ein "=" in C ist kein "Forderungszeichen", sondern eine Zuweisung.
 Das ist klar.

> Und diese Zuweisung wird nach der Berechnung gemacht.
 Das ist auch klar und üblich.

> Wenn du eine
> Berechnung mit 32 Bit Breite forderst, dann muss mindestens 1 Variable
> diese Breite haben.
 Das ist weder klar noch üblich.

 16bit * 16bit ergibt max. 32bit, selbst in C ist das so.
 32bit * 16bit kann aber mehr als 32bit ergeben, selbst in C ist das 
so.

 Ich will und kann C-Regeln nicht ändern, aber ich kann so etwas als
 unlogisch und fehlerhaft empfinden.

von S. R. (svenska)


Lesenswert?

Marc V. schrieb:
> Ich will und kann C-Regeln nicht ändern, aber ich kann so etwas als
> unlogisch und fehlerhaft empfinden.

Wenn du die C-Regeln nicht ändern willst, warum schimpfst du dann über 
alle, die die C-Regeln auch nicht ändern wollen? Irgendwie ist das 
unlogisch.

Marc V. schrieb:
>> Wenn du eine Berechnung mit 32 Bit Breite forderst,
>> dann muss mindestens 1 Variable diese Breite haben.
> Das ist weder klar noch üblich.

Eine artihmetische Operation findet mit der Bitbreite des größten 
Operanden statt, jedoch mindestens mit der Größe eines "int".

Was ist daran für dich zu schwer zu verstehen?

Und das Grundproblem hast du noch immer nicht gelöst.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

S. R. schrieb:
> Wenn du die C-Regeln nicht ändern willst, warum schimpfst du dann über
> alle, die die C-Regeln auch nicht ändern wollen? Irgendwie ist das
> unlogisch.
 Wo habe ich das gemacht?


> Eine artihmetische Operation findet mit der Bitbreite des größten
> Operanden statt, jedoch mindestens mit der Größe eines "int".

 LOL.
1
uint8_t secs = 60;
2
uint8_t mins = 60;
3
uint8_t hours = 24;
4
5
uint32_t SecProTag;
6
7
SecProTag = secs * mins * hours;
Was ist daran für dich zu schwer zu verstehen?


> Und das Grundproblem hast du noch immer nicht gelöst.
 Welches wäre ?

: Bearbeitet durch User
von S. R. (svenska)


Lesenswert?

Marc V. schrieb:
> LOL.

Wie niveauvoll.

Marc V. schrieb:
> *Was ist daran für dich zu schwer zu verstehen?*

Erstens: Schrei mal nicht so rum, wir sind hier nicht im Kindergarten 
und ich brauch keinen Sehsturz.

Zweitens: Alle Operanden sind uint8_t. Da uint8_t kleiner als "int" ist, 
wird die Rechnung also mit "int" durchgeführt. So ist das nunmal 
definiert.

Drittens: Erst wird gerechnet, dann zugewiesen. Das ist auch logisch, 
denn nicht jedes Rechenergebnis wird irgendwo zugewiesen, wo man einen 
Datentyp raus inferieren könnte.

Marc V. schrieb:
>> Und das Grundproblem hast du noch immer nicht gelöst.
> Welches wäre ?

Welcher Datentyp deiner Meinung nach für Zwischenergebnisse angemessen 
wäre, die nicht einer Variable mit bekanntem Datentyp zugewiesen werden.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

1
uint8_t msones = 10;
2
uint8_t mstenths = 10;
3
uint8_t mshundreds = 10;
4
uint8_t secs = 60;
5
uint8_t mins = 60;
6
uint8_t hours = 24;
7
8
uint32_t msecProTag;
9
10
msecProTag = msones * mstenths * mshundreds *  secs * mins * hours;
Und jetzt?
Muss die Berechnung jetzt 48 Bit breit stattfinden? Oder doch nur mit 32 
Bits?
Was soll der Compiler jetzt tun? Immerhin sind das Variablen, die Werte 
bis 255 annehmen können.

: Bearbeitet durch Moderator
von Wolfgang (Gast)


Lesenswert?

Lothar M. schrieb:
> Muss die Berechnung jetzt 48 Bit breit stattfinden? Oder doch nur mit 32
> Bits?

Wie kommst du auf 48 Bit.
Guck dir die Größe von deinem Ergebnis an und vergleiche das mit dem 
Wertebereich einer 32-Bit bzw. 48-Bit Zahl.

Deine Einzelwerte benötigen etwas weniger als 4, 5 oder 6 Bit.

von Walter (Gast)


Lesenswert?

Marc V. schrieb:
> Nein.
>  Multiplikation zwei Integerzahlen kann niemals einen float
>  erfordern. Casten zum Schluss reicht vollkommen.

nach deiner Argumentation schon, siehe:

float ergebnis;

ergebnis = 32000*30000;

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

S. R. schrieb:
> Erstens: Schrei mal nicht so rum, wir sind hier nicht im Kindergarten
> und ich brauch keinen Sehsturz.

 Ich schreie nicht rum, das steht schon mal fest.


> Zweitens: Alle Operanden sind uint8_t. Da uint8_t kleiner als "int" ist,
> wird die Rechnung also mit "int" durchgeführt. So ist das nunmal
> definiert.
>
> Drittens: Erst wird gerechnet, dann zugewiesen. Das ist auch logisch,
> denn nicht jedes Rechenergebnis wird irgendwo zugewiesen, wo man einen
> Datentyp raus inferieren könnte.

 Ich gebe es auf.
 Du hast wirklich solch enorme Schwierigkeiten etwas so einfaches und
 offensichtliches zu verstehen, daß ich mich wirklich frage ob du aus
 dem Kindergarten schreibst...

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Lothar M. schrieb:
> Und jetzt?

 Wieder in die Schule gehen, lernen zu multiplizieren und wieviele
 bits nötig sind, um eine Zahl anzuzeigen.

> Was soll der Compiler jetzt tun? Immerhin sind das Variablen, die Werte
> bis 255 annehmen können.

 Abgeschniten auf 32 bits mit Überlauf, natürlich.
 Wer so dumm ist und nicht weisst wieviele bits nötig sind um das
 Resultat anzuzeigen, verdient es nicht besser.

: Bearbeitet durch User
von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Walter schrieb:
> Marc V. schrieb:
>> Nein.
>>  Multiplikation zwei Integerzahlen kann niemals einen float
>>  erfordern. Casten zum Schluss reicht vollkommen.
>
> nach deiner Argumentation schon, siehe:
>
> float ergebnis;
>
> ergebnis = 32000*30000;

 Noch einer der mit Gewalt etwas verdrehen will.

 Nach welcher Argumentation ?

 Für das Resultat reicht uint32_t vollkommen.

Beitrag #5564926 wurde vom Autor gelöscht.
von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Lothar M. schrieb:
> Und jetzt?

Marc V. schrieb:
> Abgeschniten auf 32 bits mit Überlauf, natürlich.
>  Wer so dumm ist und nicht weisst wieviele bits nötig sind um das
>  Resultat anzuzeigen, verdient es nicht besser.

  Damit es keine Missverständnisse gibt:
  Du warst nicht gemeint, diese Aufgabe war nicht gemeint, es war
  eine hypothetische Antwort auf eine hypothetische Aufgabe, wo das
  Ergebnis tatsächlich 48 bit oder mehr betragen hätte...

: Bearbeitet durch User
von S. R. (svenska)


Lesenswert?

Marc V. schrieb:
> wo das Ergebnis tatsächlich 48 bit oder mehr betragen hätte

Woher soll denn der Compiler vor der Multiplikation von sechs 8 
Bit-Zahlen wissen, dass deren Ergebnis in eine 32 Bit-Variable passt, um 
dann die Multiplikationen in 32 Bit ausführen zu können?

Ich fürchte, Kausalität ist auch nix für dich.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

S. R. schrieb:
> Woher soll denn der Compiler vor der Multiplikation von sechs 8
> Bit-Zahlen wissen, dass deren Ergebnis in eine 32 Bit-Variable passt, um
> dann die Multiplikationen in 32 Bit ausführen zu können?

 Soll er auch nicht und es hat ihn nicht zu interessieren ob das
 Ergebnis in eine 32bit Variable passt oder nicht.
 Nur darf es nicht passieren, daß das Ergebnis oder die Zwischenwerte
 irgendwann und irgendwo auf 16bit abgeschnitten werden.
 Sondern natürlich als volle 32bit zurückgegeben werden.

 Eine dezente Warnung auf Überlauf würde aber in diesem speziellem
 Fall auch nicht schaden, mehr aber auch nicht...


> Ich fürchte, Kausalität ist auch nix für dich.
 Und ich fürchte, Logik ist auch nix für dich.

: Bearbeitet durch User
von Arno (Gast)


Lesenswert?

Marc V. schrieb:
> S. R. schrieb:
>> Woher soll denn der Compiler vor der Multiplikation von sechs 8
>> Bit-Zahlen wissen, dass deren Ergebnis in eine 32 Bit-Variable passt, um
>> dann die Multiplikationen in 32 Bit ausführen zu können?
>
>  Soll er auch nicht und es hat ihn nicht zu interessieren ob das
>  Ergebnis in eine 32bit Variable passt oder nicht.
>  Nur darf es nicht passieren, daß das Ergebnis oder die Zwischenwerte
>  irgendwann und irgendwo auf 16bit abgeschnitten werden.

Wir haben alle verstanden, dass du das forderst. Du bist aber für die 
Sprache C nicht relevant, und der C-Standard fordert das nicht. Das hast 
du bisher nicht verstehen wollen.

>  Sondern natürlich als volle 32bit zurückgegeben werden.

Wäre ja auch noch schöner, wenn der Compiler 16 der 32 Bit austrinken 
und leer zurückgeben würde ;)

MfG, Arno

von S. R. (svenska)


Lesenswert?

Marc V. schrieb:
> Sondern natürlich als volle 32bit zurückgegeben werden.

Warum eigentlich gerade 32, und nicht 48 oder 64?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Arno schrieb:
> Wäre ja auch noch schöner, wenn der Compiler 16 der 32 Bit austrinken
> und leer zurückgeben würde ;)

S. R. schrieb:
> Warum eigentlich gerade 32, und nicht 48 oder 64?

 Nur für schwachsinnige Idioten:

 Weil VorwahlZeit als uint32_t deklariert wurde.


 Für Moderatoren:
 Sollte dies gelöscht werden, heisst es, dass die beiden Idioten
 sind, falls es nicht gelöscht wird, sind es 2 hypothetische
 Idioten.

von S. R. (svenska)


Lesenswert?

Marc V. schrieb:
> Weil VorwahlZeit als uint32_t deklariert wurde.

Du schreist immernoch (Fettschrift). Plenken tust du sowieso.

Was ist mit Rechenoperationen, die nicht direkt in einer 
Variablenzuweisung münden? Und warum sollte ich bei einer Zuweisung an 
einen uint32_t alle Rechenoperationen mit exakt 32 Bit durchführen 
müssen?

Ganz einfach: Weil du nicht für 5 Pfennig nachdenkst, was dir andere 
schreiben.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

S. R. schrieb:
> Du schreist immernoch (Fettschrift). Plenken tust du sowieso.
 Nein, dafür gibt es Ausrufungszeichen und Grossbuchstaben.
 Mit Fettschrift und Unterstreichen betont man etwas, es soll aber
 nicht alles so geschrieben werden. Ein Satz ist aber durchaus erlaubt
 und üblich.
 Plenken (aber nur mit Ausrufungs- und Fragezeichen) werde ich auch
 weiter tun, weil es viel übersichtlicher ist und weil ich es so mag.

> Was ist mit Rechenoperationen, die nicht direkt in einer
> Variablenzuweisung münden?
 Uninteressant, es muss nur sichergestellt werden, dass mindestens
 (in diesem Fall) 32 bit als Ergebnis der Operation bereitgestellt
 werden.

> Und warum sollte ich bei einer Zuweisung an
> einen uint32_t alle Rechenoperationen mit exakt 32 Bit durchführen
> müssen?
 Erstens, Computer macht das, nicht du und zweitens, niemand hat das
 verlangt, solange das Ergebnis stimmt.

S. R. schrieb:
> Ganz einfach: Weil du nicht für 5 Pfennig nachdenkst, was dir andere
> schreiben.

 Nein, weil Ihr alle so überzeugt seid das C fehlerfrei ist, dass
 es Euch gar nicht interessiert, worum es hier eigentlich geht.
 Nicht darum, ob C gut oder schlecht ist, sondern darum, ob dies
 ein Fehler ist oder nicht.

 Und es ist ein Fehler, aber dich interessiert es genauso wenig, was
 andere schreiben.
 Nimm dieses Beispiel:
 Beitrag "Re: Formel-/Berechnungsprobleme"

 Alle anderen Sprachen (zumindest die, die ich kenne und benutze)
 rechnen das richtig aus, nur C nicht.

 Und dann kommst du und noch ein paar Sturköpfe mit der Behauptung:
 "ja das ist vollkommen in Ordnung so, das muss so sein, wenn du es
 richtig haben willst musst du folgende Verrenkungen machen aber das
 ist auch ganz in Ordnung so".

 Ich will aber keine Verrenkungen machen, ich will normale Programme
 schreiben und mich aufs Wesentliche konzentrieren, nicht auf die
 stundenlange Fehlersuche im Programm.
 Wenn ich in C programmieren will, muss ich mich damit abfinden,
 aber deswegen muss ich noch lange nicht behaupten, das es ganz
 normal und kein Fehler ist.

von Roland F. (rhf)


Lesenswert?

Hallo,

Marc V. schrieb:
>  Nein, weil Ihr alle so überzeugt seid das C fehlerfrei ist...

Das "alle so überzeugt sind das C fehlerfrei ist" unterstellst du den 
Anderen und ist hier nie geäußert worden.

>  Und es ist ein Fehler, aber dich interessiert es genauso wenig, was
>  andere schreiben.

Das ist deine Meinung, aber wie mehrfach ausgeführt wurde ist es einfach 
eine Eigenschaft von C. Man kann jetzt darüber streiten ob diese 
Eigenschaft gut oder schlecht ist (ich persönlich halte sie für ziemlich 
problematisch), aber das ändert nichts daran das sie so ist wie sie ist.

>  Und dann kommst du und noch ein paar Sturköpfe mit der Behauptung:
>  "ja das ist vollkommen in Ordnung so, das muss so sein, wenn du es
>  richtig haben willst musst du folgende Verrenkungen machen aber das
>  ist auch ganz in Ordnung so".

Wieder eine Interpretation von dir was andere für vollkommen in Ordnung 
halten.

>  Wenn ich in C programmieren will, muss ich mich damit abfinden,
>  aber deswegen muss ich noch lange nicht behaupten, das es ganz
>  normal und kein Fehler ist.

Richtig, und das ist praktisch auch genau das was hier alle "Anderen" 
sagen.

rhf

P.S.:
Das ist jetzt schon die zweite Diskussion in dieser Woche in der 
"C-Gegner" völlig ausrasten und mit verbalen Entgleisungen auf ihre 
Kontrahenten losgehen. Kommt mal runter.
Ihr solltet mal ein wenig in euch gehen und klar machen das es hier 
"nur" um eine pragmatische Programmiersprache geht, die zu einer Zeit 
und von Leuten entwickelt wurde, die damit einfach nur ihre damaligen 
Probleme lösen wollten. Und diese Leute waren keine theoretischen 
Informatiker oder Linguisten. Wenn diese Personen geahnt hätten, das C 
jemals solch eine Bedeutung erlangen würde, hätten sie sich beim Entwurf 
der Sprache sicher mehr Gedanken gemacht.

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

S. R. schrieb:
> Woher soll denn der Compiler vor der Multiplikation von sechs 8
> Bit-Zahlen wissen, dass deren Ergebnis in eine 32 Bit-Variable passt, um
> dann die Multiplikationen in 32 Bit ausführen zu können?

Er weiss es überhaupt nicht. DU musst es beim Schreiben des Programms 
wissen und ihm sagen, mit welchem Typ er arbeiten soll. Beim Fehlen 
weiterer Anweisungen nimmt er int.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Roland F. schrieb:
> Das ist jetzt schon die zweite Diskussion in dieser Woche in der
> "C-Gegner" völlig ausrasten und mit verbalen Entgleisungen auf ihre
> Kontrahenten losgehen. Kommt mal runter.

 Nun, ich finde nicht, dass ich völlig ausgerastet bin. Sollte dies
 trotzdem der Fall sein und ich jemanden beleidigt habe, entschuldige
 ich mich hiermit.

von Einer K. (Gast)


Lesenswert?

Marc V. schrieb:
> Nun, ich finde nicht, dass ich völlig ausgerastet bin.
Das finde ich allerdings doch!

Marc V. schrieb:
> Sollte dies
>  trotzdem der Fall sein und ich jemanden beleidigt habe,
Auch ich könnte ich dir sagen: Ja!
Wie du die Leute angehst, hat was beleidigendes/herabwürdigendes.

Marc V. schrieb:
> entschuldige ich mich hiermit.
Du kannst um Verzeihung bitten.
Das ist eine Gnade, welche dir das jeweilige Opfer gewähren kann.
Du hast kein Recht das einzufordern.

Niemals darf sich ein Verursacher von Leid und Streit, selbst von seiner 
Schuld befreien. Das wäre tief amoralisch/unethisch.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Arduino Fanboy D. schrieb:
> Marc V. schrieb:
>> entschuldige ich mich hiermit.
> Du kannst um Verzeihung bitten.
> Das ist eine Gnade, welche dir das jeweilige Opfer gewähren kann.
> Du hast kein Recht das einzufordern.
>
> Niemals darf sich ein Verursacher von Leid und Streit, selbst von seiner
> Schuld befreien. Das wäre tief amoralisch/unethisch.

 Aber sonst geht es dir ganz gut, oder ?
 Ich meine, keine Schmerzen, keine Stimmen aus dem Hintergrund die dir
 etwas unmoralisches befehlen oder so etwas ?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Naja, Marcs Tonfall mag etwas grenzwertig gewesen sein, auch wirkten 
seine fortwährenden Hervorhebungen sehr anstrengend besserwisserisch 
und laut, aber daß er direkt Leute beleidigt hat, kann ich nicht 
bestätigen. Das hat hier in diesem Thread nur der andere Clown 
hinbekommen, der ohne Beleidigungen anscheinend seine Ahnungslosigkeit 
nicht verbreiten kann.

Tip für Marc: Versuch nächstes mal diese Art von Hervorhebung zu 
verwenden, die wirkt weniger aufdringlich.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Rufus Τ. F. schrieb:
> Tip für Marc: Versuch nächstes mal diese Art von Hervorhebung zu
> verwenden, die wirkt weniger aufdringlich.

 OK, angekommen.

 Abr um auf das Problem zurückzukommen:

 Bei der Typkonvertierung wird nur von Operanden gesprochen, was
 zum Trugschluss führen kann, dass die Operation/en danach richtig
 ausgeführt werden.

 Es wird u.a. aufgeführt wie die Operanden umzuwandeln sind, damit
 es zu einem allgemeinen typ kommt.
 Und dann:
 Wenn keine der aufgeführten Bedingungen zutrifft (ulong, uint, float,
 double, etc.) werden alle Operanden mindestens auf den Typ integer
 umgewandelt.
 Und der Zweck ist ?
 ZITAT:
1
Der Zweck besteht darin, einen allgemeinen Typ zu erhalten, der gleichzeitig der Ergebnistyp ist.

 In diesem Fall wurde der Ergebnistyp aber explizit
 als 32bit deklariert.

 Was aber noch schlimmer ist:
 Wie wir alle wissen, kann eine 16bit*16bit Multiplikation zu einem
 32bit Ergebnis führen (muss natürlich nicht).

 Deswegen ist:
 uint32_t = uint16_t * uint16_t
 richtig und so hat es der TO gemacht.

 Aber:
 uint16_t = uint16_t * uint16_t
 falsch und so hat es der Compiler gemacht.

 Was muss man dem Compiler noch mitteilen, damit es richtig gemacht
 wird ?

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Marc V. schrieb:
> Was muss man dem Compiler noch mitteilen, damit es richtig gemacht
>  wird ?
Mann muss ihm sagen, dass man mit seinem Wissen als Programmierer nicht 
nur die Zuweisung, sondern auch die Berechnung in 32 Bit haben will. Und 
dann schreibt man ul hinter eine Konstante oder man castet einen der 
Operanden auf 32 Bit.
Ich meine, dass das schon wiederholt im Thread angesprochen wurde. So 
ist C einfach, wenn einem das nicht gefällt, muss man eine andere 
Sprache verwenden.

Kleiner Abschweif: in VHDL muss die Vektorbreite vom Programmierer aufs 
Bit genau bekannt gemacht und ausgeschrieben werden, sonst gibt es eine 
Fehlermeldung.

: Bearbeitet durch Moderator
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.