Discussion:
Compiler-Unterschiede
(zu alt für eine Antwort)
Helmut Schellong
2015-08-29 13:40:33 UTC
Permalink
Raw Message
#if CHAR_MIN != 0
# error "Option -funsigned-char (o.vglb.) fehlt!"
#endif

Vorstehendes funktioniert nicht mit allen Compilern.

unsigned long long U;

if (U < 100000000000000) ;

Vorstehende Konstante wird von einem Compiler
nicht akzeptiert: Wertüberlauf
--
Mit freundlichen Grüßen
Helmut Schellong ***@schellong.biz
www.schellong.de www.schellong.com www.schellong.biz
http://www.schellong.de/c.htm
Thomas Koenig
2015-08-30 09:49:25 UTC
Permalink
Raw Message
Post by Helmut Schellong
Vorstehendes funktioniert nicht mit allen Compilern.
unsigned long long U;
if (U < 100000000000000) ;
Vorstehende Konstante wird von einem Compiler
nicht akzeptiert: Wertüberlauf
Komisch.

100000000000000 ist kleiner als der minimale Wert für LLONG_MAX,
und seit den Zeiten des Propheten ANSI ist der Typ einer Konstante
der kleinste, in dem die entsprechende Konstante repräsentiert
werden kann. Dein System hat 'long long', daher...

Das ist ein Compilerfehler, da ist eine Fehlermeldung angebracht.

Welcher Compiler ist es denn?
Helmut Schellong
2015-08-31 07:39:58 UTC
Permalink
Raw Message
Post by Thomas Koenig
Post by Helmut Schellong
Vorstehendes funktioniert nicht mit allen Compilern.
unsigned long long U;
if (U < 100000000000000) ;
Vorstehende Konstante wird von einem Compiler
nicht akzeptiert: Wertüberlauf
Komisch.
100000000000000 ist kleiner als der minimale Wert für LLONG_MAX,
und seit den Zeiten des Propheten ANSI ist der Typ einer Konstante
der kleinste, in dem die entsprechende Konstante repräsentiert
werden kann. Dein System hat 'long long', daher...
Das ist ein Compilerfehler, da ist eine Fehlermeldung angebracht.
Welcher Compiler ist es denn?
Es ist wohl der bcc32.exe im alten Borland C++ Builder 4, aber ganz
sicher bin ich nicht.
Isoliert betrachtet ist die Konstante fehlerhaft.
Aber es geht um einen Vergleich mit ull und um Initialisierungen
von ll-Arrays.
In diesem Kontext hängen die anderen Compiler implizit
ull oder ll an.
Einer tat es nicht. Suffix l reicht dem auch nicht.
--
Mit freundlichen Grüßen
Helmut Schellong ***@schellong.biz
www.schellong.de www.schellong.com www.schellong.biz
http://www.schellong.de/c.htm
Bernd Nawothnig
2015-08-31 08:49:08 UTC
Permalink
Raw Message
Post by Helmut Schellong
In diesem Kontext hängen die anderen Compiler implizit
ull oder ll an.
Einer tat es nicht. Suffix l reicht dem auch nicht.
Im Standard steht ja auch nirgends, wie groß char, int, long und long
long genau sein müssen. Da wird nur die <= Beziehung der
entsprechenden sizeof()s festgeschrieben.

Allerdings müsste der Compiler das passende Suffix eben automatisch
anhängen.




Bernd
--
no time toulouse
Helmut Schellong
2015-08-31 09:18:18 UTC
Permalink
Raw Message
Post by Bernd Nawothnig
Post by Helmut Schellong
In diesem Kontext hängen die anderen Compiler implizit
ull oder ll an.
Einer tat es nicht. Suffix l reicht dem auch nicht.
Im Standard steht ja auch nirgends, wie groß char, int, long und long
long genau sein müssen. Da wird nur die <= Beziehung der
entsprechenden sizeof()s festgeschrieben.
Allerdings müsste der Compiler das passende Suffix eben automatisch
anhängen.
Die interessante Frage ist, ob ein Compiler eine Konstante isoliert
betrachten darf.
Ohne Suffix liegt der Typ int vor. Dafür ist der Wert zu groß.

Es ist auch ein Unterschied, ob der Compiler einen Wert auf einen
breiteren Wert erweitert, oder ob er eine Konstante automatisch
umdeklariert.
--
Mit freundlichen Grüßen
Helmut Schellong ***@schellong.biz
www.schellong.de www.schellong.com www.schellong.biz
http://www.schellong.de/c.htm
Bernd Nawothnig
2015-08-31 09:53:18 UTC
Permalink
Raw Message
Post by Helmut Schellong
Die interessante Frage ist, ob ein Compiler eine Konstante isoliert
betrachten darf.
Ohne Suffix liegt der Typ int vor. Dafür ist der Wert zu groß.
Es ist auch ein Unterschied, ob der Compiler einen Wert auf einen
breiteren Wert erweitert, oder ob er eine Konstante automatisch
umdeklariert.
Da es sich hier um einen Vergleich mit einem long long handelte, ist
Fall ziemlich klar. Die Konstante muss in jedem Fall letztendlich auch
ein long long werden. Ob das durch implizites Anhängen des passenden
Suffixes oder nachträgliches Casten geschieht, ist dabei egal. Auf
jeden Fall dürfte es ohne Suffix keine Fehlermeldung geben.




Bernd
--
no time toulouse
Thomas Koenig
2015-09-01 16:12:30 UTC
Permalink
Raw Message
Post by Helmut Schellong
Isoliert betrachtet ist die Konstante fehlerhaft.
Das stimmt nicht. Die Konstante ist korrekt, weil sie in C99
automatisch den Typ 'long long int' bekommt, falls 'long int'
nicht ausreicht, was es laut Norm nicht muss.

Begründung siehe anderer Artikel in dem Thread, bezüglich
N1256, 6.4.4.1.
Helmut Schellong
2015-09-01 16:31:48 UTC
Permalink
Raw Message
Post by Thomas Koenig
Post by Helmut Schellong
Isoliert betrachtet ist die Konstante fehlerhaft.
Das stimmt nicht. Die Konstante ist korrekt, weil sie in C99
automatisch den Typ 'long long int' bekommt, falls 'long int'
nicht ausreicht, was es laut Norm nicht muss.
»falls 'long int' nicht ausreicht,«

Du betrachtest die Konstante folglich nicht isoliert!
Das ist jedoch meine Bedingung.
--
Mit freundlichen Grüßen
Helmut Schellong ***@schellong.biz
www.schellong.de www.schellong.com www.schellong.biz
http://www.schellong.de/c.htm
Helmut Schellong
2015-09-01 16:59:37 UTC
Permalink
Raw Message
Post by Helmut Schellong
Post by Thomas Koenig
Post by Helmut Schellong
Isoliert betrachtet ist die Konstante fehlerhaft.
Das stimmt nicht. Die Konstante ist korrekt, weil sie in C99
automatisch den Typ 'long long int' bekommt, falls 'long int'
nicht ausreicht, was es laut Norm nicht muss.
»falls 'long int' nicht ausreicht,«
Du betrachtest die Konstante folglich nicht isoliert!
Das ist jedoch meine Bedingung.
Ich ahne jetzt, wie Du das meinst.
Wenn der Wert, den ich eingetippt habe (z.B.4000000000000000)
für int nicht reicht, wird automatisch zu einem
breiteren Typ gewechselt.
Auch ohne den Kontext eines breiteren Typs.

Suffix Decimal Constant
none int
long int
long long int
u or U unsigned int
unsigned long int
unsigned long long int

Das habe ich bisher nicht gewußt, da der Suffix
ll ull neu eingeführt wurde.
--
Mit freundlichen Grüßen
Helmut Schellong ***@schellong.biz
www.schellong.de www.schellong.com www.schellong.biz
http://www.schellong.de/c.htm
Stefan Reuther
2015-09-05 20:46:35 UTC
Permalink
Raw Message
Hallo,
Post by Helmut Schellong
Post by Helmut Schellong
unsigned long long U;
if (U < 100000000000000) ;
Vorstehende Konstante wird von einem Compiler
nicht akzeptiert: Wertüberlauf
[...]
Post by Helmut Schellong
Es ist wohl der bcc32.exe im alten Borland C++ Builder 4, aber ganz
sicher bin ich nicht.
Behauptet der Compiler, C99 zu können? Ob seines
Veröffentlichungs-datums bezweifle ich das mal. Und in C90 und C++98 ist
bei 32 Bit Schluss.


Stefan
Helmut Schellong
2015-09-05 23:03:55 UTC
Permalink
Raw Message
Post by Stefan Reuther
Hallo,
Post by Helmut Schellong
Post by Helmut Schellong
unsigned long long U;
if (U < 100000000000000) ;
Vorstehende Konstante wird von einem Compiler
nicht akzeptiert: Wertüberlauf
[...]
Post by Helmut Schellong
Es ist wohl der bcc32.exe im alten Borland C++ Builder 4, aber ganz
sicher bin ich nicht.
Behauptet der Compiler, C99 zu können? Ob seines Veröffentlichungs-datums
bezweifle ich das mal. Und in C90 und C++98 ist bei 32 Bit Schluss.
Builder 5 von 2000 macht das gleiche.
Builder 7 von April 2015 auch.
Das gilt für bcc32.exe, nicht für bcc64.exe (clang-basiert)(2015).

Wahrscheinlich wird bei bcc32 nicht C99 behauptet.

Builder 4 kennt übrigens den Typ __int64,
und unsigned __int64 und 12345i64, 12345ui64.
--
Mit freundlichen Grüßen
Helmut Schellong ***@schellong.biz
www.schellong.de www.schellong.com www.schellong.biz
http://www.schellong.de/c.htm
Bernd Nawothnig
2015-08-30 10:12:27 UTC
Permalink
Raw Message
Post by Helmut Schellong
if (U < 100000000000000) ;
if (U < 100000000000000l) ;



Bernd
--
no time toulouse
Thomas Koenig
2015-08-30 11:08:04 UTC
Permalink
Raw Message
Post by Bernd Nawothnig
Post by Helmut Schellong
if (U < 100000000000000) ;
if (U < 100000000000000l) ;
Das funktioniert vermutlich, sollte aber nicht nötig sein.

Um mal aus N1256, 6.4.4.1 zu zitieren, also C99:

The type of an integer constant is the first of the corresponding
list in which its value can be represented.

... und dann kommt eine Liste, in der für das Suffix "none"
die möglichen Typen "int", "long int" und "long long int"
angegeben sind.

Damit wäre 100000000000000 eine "long long int" - Konstante,
falls es nicht schon unter "long int" fallen sollte.

Der Werbebereich von "long long int" geht mindestens bis LLONG_MAX,
und das ist mindesstens +9223372036854775807, was größer als
100000000000000 (auch wenn man dafür erst mal Stellen zählen
muss :-)

Ergo: Compilerfehler.
Loading...