Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Re: Das ist kein Bug Kategorie: Programmierung (von Olaf - 21.03.2004 9:50)
Als Antwort auf Das ist kein Bug von André H. - 15.03.2004 22:45
Ich nutze:
C-Control II Station, OSOPT_V2
Hallo Andre,

> Das ist kein Bug. (siehe auch FAQ: Berechnungen mit long)
> Woher soll denn die VM wissen, daÃ? das Ergebnis long sein soll, wenn mit
> zwei Integerwerten gerechnet wird !? :-)

da C2 ja eine getypte Sprache ist könnte der Compiler auch mal auf die linke Seite schauen,
wie es "richtige" Programmiersprachen, wie z.B. Java tun. Folgendes Java Programm


import java.io.*;

public class test {
  public static void main(String args[])
  {
    byte i;
    int  e;
   
    i = 16;
    e = 1 << i;
    System.out.println(Integer.toBinaryString(e));
  }
}


ergibt erwartungsgemä�
[c:dev]java test
10000000000000000

insofern ist Bug vielleicht der falsche Begriff, unerwartetes Verhalten und vor allem nicht
konsistentes Verhalten (s.u.) trifft es wohl eher.
ZugegebenermaÃ?en hat die Entwicklung der Java Programmiersprache JavaSoft bzw. Sun
auch bestimmt ein bisschen mehr Geld gekostet als C2 den Leuten von Conrad.



> SchlieÃ?lich ist des C164CI ein 16Bit.-Controller und kein 32Bit. :-)
das ist ein Implementationsdetail und sollte eine "Virtuelle" Maschine nicht beeindrucken, deswegen
heiÃ?t Sie ja auch so.

...

> Kurz: Wenn beide Operatoren einer Berechnung Integer sind, ist das Ergenis auch Integer.
> Wenn mind. einer der beiden Operatoren vom Typ Long ist, ist das Ergebnis auch Long.
> (Hier werden erweiterte Routinen für Long ausgeführt.)
> Dasselbe gilt auch für float.

Das stimmt so nicht ganz denn folgendes passiert


long vlong, long1, vlong16;
int vInt;

vlong1 = 1;
vInt16 = 16;
vlong16 = 16;

1.) vlong = 1 shl 16;    funktioniert im Simulator, ccontrol habe ich nicht getestet.
2.) vlong = 1 shl vInt16;   funktioniert NICHT im Simulator und NICHT in der CCONTROL
3.) vlong = 1 shl vLong16;   funktioniert im Simulator aber NICHT in der CCONTROL
4.) vlong = vlong1 shl vInt16;  funktioniert im Simulator und in der CCONTROL


Wenn deine Aussage oben richtig wäre würde Fall 1.) mit reinen Konstantenausdrücken
nicht und Fall 3.) funktionieren.
Im Fall 3.) passiert aber etwas wirklich unschönes, nämlich dass es im Simulator
läuft in der echten CControl aber nicht.
Wahrscheinlich ist der "shift" Operator hier ein Sonderfall, da dieser den Typ des rechten
Operanten nur bedingt in die Berechnung einbezieht...

Also meine Warnung an alle Programmierer erhalte ich aufrecht und denke das dieses ein
zumindest nicht korrektes Verhalten darstellt.

Olaf





    Antwort schreiben


Antworten:

Re: Das ist kein Bug (von Dietmar Weickert - 22.03.2004 13:51)
Re: Das ist kein Bug (von André H. - 21.03.2004 12:56)