C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Compilerfehler -> comparing signed and unsigned
Goto page 1, 2  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Sascha Fuhrmann
Guest





PostPosted: Mon Sep 06, 2004 10:52 am    Post subject: Compilerfehler -> comparing signed and unsigned Reply with quote



Hallo zusammen,

bin gerade dabei, mich etwas mit C++ zu beschäftigen, und führe dazu die
Übungen aus meinem Buch durch.

Bei folgendem Code schmeisst mir dder Compiler immer die Warnung aus,
dass in Zeile 21 (die While-Schleife) 'signed' und 'unsigned' Werte
verglichen würden, was aber meiner Meinung nach nicht zutrifft.

-----schnipp-----
#include <iostream>
using namespace std;

int main()
{
typedef unsigned short ushort;
typedef unsigned long ulong;

ushort iSmall;
ulong iLarge;

const ushort iMAXSMALL = 65535;

cout << "Bitte eine kleine Zahl eingeben: ";
cin >> iSmall;
cout << "Bitte eine grosse Zahl eingeben: ";
cin >> iLarge;

cout << "Klein: " << iSmall << "...";

while(iSmall < iLarge && iLarge > 0 && iSmall < iMAXSMALL)
{
if (iSmall % 5000 == 0)
{
cout << ".";
}
iSmall++;
iLarge-=2;
}
cout << "nKlein: " << iSmall << " Gross: " << iLarge << endl;

return 0;
}
-----schnapp-----

Wenn ich die Bedingung "iSmall < iLarge" rausnehme, dann erscheint die
Meldung nicht Sad
Ich bin mir aber ziemlich sicher, dass ich die Variablen in den Zeilen 9
und 10 durch die Zeilen 6 und 7 (typedef) ganz klar als "unsigned"
deklariere.
Oder will mir der Compiler einfach nur sagen, dass ich "short int" und
"long int" vergleiche?!?

Wisst Ihr, was der Compiler dort genau anmeckert?

Vielen Dank für Eure Hilfe.
--
Gruß
Sascha

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Sascha Fuhrmann
Guest





PostPosted: Mon Sep 06, 2004 12:36 pm    Post subject: Re: Compilerfehler -> comparing signed and unsigned Reply with quote



Ich vergaß, zu erwähnen, dass ich die aktuelle Version des Borland C++
Compilers einsetze.
--
Gruß
Sascha

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Steffen Rauh
Guest





PostPosted: Mon Sep 06, 2004 12:48 pm    Post subject: Re: Compilerfehler -> comparing signed and unsigned Reply with quote



Quote:
Bei folgendem Code schmeisst mir dder Compiler immer die Warnung aus,
dass in Zeile 21 (die While-Schleife) 'signed' und 'unsigned' Werte
verglichen würden, was aber meiner Meinung nach nicht zutrifft.
while(iSmall < iLarge && iLarge > 0 && iSmall < iMAXSMALL)
Wisst Ihr, was der Compiler dort genau anmeckert?

Er meckert darüber, dass er vorzeichenbehaftete Werte mit vorzeichenlosen
Werten vergleicht. Deine Variablen sind zwar vorzeichenlos, aber "0" wird
der Compiler als normalen vorzeichenbehafteten Integer interpretieren,
solange du ihm nicht explizit etwas anderes sagst (z.B. über einen Cast).

MfG,
Steffen Rauh

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Sascha Fuhrmann
Guest





PostPosted: Mon Sep 06, 2004 1:34 pm    Post subject: Re: Compilerfehler -> comparing signed and unsigned Reply with quote

Steffen Rauh schrieb:
Quote:
Deine Variablen sind zwar vorzeichenlos, aber "0" wird
der Compiler als normalen vorzeichenbehafteten Integer interpretieren,

Wenn Du das sagst, glaube ich es einfach mal, auch wenn mir schleierhaft
ist, warum er den Fehler nicht mehr bringt, wenn ich die Bedingung
"iSmall < iLarge" rausnehme, "iLarge > 0" aber immer noch vorhanden
ist?! Kannst Du mir das erklären?

Quote:
solange du ihm nicht explizit etwas anderes sagst (z.B. über einen Cast).

Soweit bin ich noch nicht, werde es aber in Erinnerung behalten ;)

Vielen Dank für Deine Antworten.
--
Gruß
Sascha

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Bastian Blank
Guest





PostPosted: Mon Sep 06, 2004 1:43 pm    Post subject: Re: Compilerfehler -> comparing signed and unsigned Reply with quote

Sascha Fuhrmann wrote:
Quote:
Bei folgendem Code schmeisst mir dder Compiler immer die Warnung aus,
dass in Zeile 21 (die While-Schleife) 'signed' und 'unsigned' Werte
verglichen würden, was aber meiner Meinung nach nicht zutrifft.
[...]
while(iSmall < iLarge && iLarge > 0 && iSmall < iMAXSMALL)

Seit wann ist in C++ eine allein stehende Zahl unsigned?

Ein "iSmall < iLarge && iLarge && iSmall < iMAXSMALL" hätte sowieso den
gleichen Effekt.

Bastian

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Steffen Rauh
Guest





PostPosted: Mon Sep 06, 2004 2:44 pm    Post subject: Re: Compilerfehler -> comparing signed and unsigned Reply with quote

Quote:
Deine Variablen sind zwar vorzeichenlos, aber "0" wird
der Compiler als normalen vorzeichenbehafteten Integer interpretieren,
Wenn Du das sagst, glaube ich es einfach mal, auch wenn mir schleierhaft
ist, warum er den Fehler nicht mehr bringt, wenn ich die Bedingung
"iSmall < iLarge" rausnehme, "iLarge > 0" aber immer noch vorhanden
ist?! Kannst Du mir das erklären?

Denkbar wäre noch, dass der Compiler für den Vergleich der beiden Variablen
den ushort zu einem int erweitert. Da ushort komplett in einem int
aufgenommen werden kann, besteht für den Compiler keine Veranlassung eine
Konvertierung in einen vorzeichenlosen Datentyp durchzuführen. Durch einen
Cast dürfte das auch wieder zu korrigieren sein.

Grundsätzlich ist es aber immer problematisch, Datentypen unterschiedlicher
Größe oder unterschiedlicher Vorzeichenbehaftung miteinander zu vergleichen.
Das kann schnell ins Auge gehen, wenn man sich nicht absolut sicher ist, was
man da eigentlich macht.

MfG,
Steffen Rauh

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Dirk Clemens
Guest





PostPosted: Mon Sep 06, 2004 3:00 pm    Post subject: Re: Compilerfehler -> comparing signed and unsigned Reply with quote

Sascha Fuhrmann wrote:
Quote:
Hallo zusammen,

ushort iSmall;
ulong iLarge;

while(iSmall < iLarge && iLarge > 0 && iSmall < iMAXSMALL)

Der Fehler liegt im Teil 'iSmall < iLarge'.
ushort wird bei Rechenoperationen implizit zu int gewandelt
und dann mit einem ulong verglichen.
Daher der signed/usigned Fehler.

Lemmi

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Markus Schaaf
Guest





PostPosted: Mon Sep 06, 2004 6:41 pm    Post subject: Re: Compilerfehler -> comparing signed and unsigned Reply with quote

"Dirk Clemens" <web-dc (AT) ftb-net (DOT) de> schrieb:
Quote:
Sascha Fuhrmann wrote:
Hallo zusammen,

ushort iSmall;
ulong iLarge;

while(iSmall < iLarge && iLarge > 0 && iSmall < iMAXSMALL)

Der Fehler liegt im Teil 'iSmall < iLarge'.
ushort wird bei Rechenoperationen implizit zu int gewandelt
und dann mit einem ulong verglichen.

Warum sollte der Compiler das machen? Und wie vergleicht er
einen »int« mit einem »unsigned long«?

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Falk Tannhäuser
Guest





PostPosted: Mon Sep 06, 2004 7:27 pm    Post subject: Re: Compilerfehler -> comparing signed and unsigned Reply with quote

Markus Schaaf wrote:

Quote:
"Dirk Clemens" <web-dc (AT) ftb-net (DOT) de> schrieb:

Der Fehler liegt im Teil 'iSmall < iLarge'.
ushort wird bei Rechenoperationen implizit zu int gewandelt
und dann mit einem ulong verglichen.

Warum sollte der Compiler das machen?

Wegen §§ 5/9 und 4.5/1?
"[...] the integral promotions (4.5) shall be performed on both operands.
Then, if either operand is unsigned long the other shall be converted
to unsigned long. [...]"
Also wird erst der 'ushort' zu 'int' (oder 'unsigned int', falls 'int'
nicht alle Werte von 'ushort' darstellen kann, was auf Maschinen der
Fall wäre, wo sizeof(unsigned short) == sizeof(int) ist) promoviert und
dann weiter zu 'unsigned long'.
Allerdings bleibt der Wert dabei erhalten, so dass es keine Probleme
geben kann, wie sie beim Vergleich negativer Ganzzahlwerte mit
vorzeichenlosen Ganzzahlwerten auftreten (s.u.) und die Warnung
m.E. witzlos ist.

Und wie vergleicht er
Quote:
einen »int« mit einem »unsigned long«?

Nach §§ 5.9/2 und 5/9 wird der 'int'-Wert in 'unsigned long'
konvertiert, wobei nach § 4.7/2 die Modulo-2^n-Arithmetik
angewendet wird. Dies hat z.B. zur Folge, dass (-1 < 1UL)
lustigerweise 'false' ergibt...

MfG
Falk

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Sascha Fuhrmann
Guest





PostPosted: Mon Sep 06, 2004 10:12 pm    Post subject: Re: Compilerfehler -> comparing signed and unsigned Reply with quote

Bastian Blank schrieb:
Quote:
Seit wann ist in C++ eine allein stehende Zahl unsigned?

Wie bereits erwähnt, muss sich die Meldung auf die Bedingung 'iSmall <
iLarge' beziehen, und nicht auf 'iLarge > 0', da die Meldung nicht
aufscheint, wenn ich ersteres weglasse!

Quote:
Ein "iSmall < iLarge && iLarge && iSmall < iMAXSMALL" hätte sowieso den
gleichen Effekt.

Das weiss ich mittlerweile auch, aber zu dem Zeitpunkt war ich halt noch
nicht so weit, und ich führe die Beispielübungen so durch, wie sie im
Buch beschrieben sind.

Btw: Dein Codeschnipsel bringt den gleichen Fehler, was die These
untermauert, dass es nicht an dieser Bedingung liegt.

Trotzdem danke für Dein Bemühen!
--
Gruß
Sascha

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Sascha Fuhrmann
Guest





PostPosted: Mon Sep 06, 2004 10:15 pm    Post subject: Re: Compilerfehler -> comparing signed and unsigned Reply with quote

Dirk Clemens schrieb:
Quote:
Der Fehler liegt im Teil 'iSmall < iLarge'.
ushort wird bei Rechenoperationen implizit zu int gewandelt
und dann mit einem ulong verglichen.

Das scheint mir eine plausible Erklärung zu sein; hätten der Autor ja
auch mal drauf hinweisen können Wink Vielen Dank!!!
--
Gruß
Sascha

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Sascha Fuhrmann
Guest





PostPosted: Mon Sep 06, 2004 10:17 pm    Post subject: Re: Compilerfehler -> comparing signed and unsigned Reply with quote

Steffen Rauh schrieb:
Quote:
Grundsätzlich ist es aber immer problematisch, Datentypen unterschiedlicher
Größe oder unterschiedlicher Vorzeichenbehaftung miteinander zu vergleichen.

Ok, werde mich in der Praxis dran halten, wenn ich irgendwann mal soweit
bin. Vielen Dank!
--
Gruß
Sascha

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Horst Kraemer
Guest





PostPosted: Tue Sep 07, 2004 5:50 am    Post subject: Re: Compilerfehler -> comparing signed and unsigned Reply with quote

Sascha Fuhrmann <sfx (AT) despammed (DOT) com> wrote:

Quote:
Hallo zusammen,

bin gerade dabei, mich etwas mit C++ zu beschäftigen, und führe dazu die
Übungen aus meinem Buch durch.

Bei folgendem Code schmeisst mir dder Compiler immer die Warnung aus,
dass in Zeile 21 (die While-Schleife) 'signed' und 'unsigned' Werte
verglichen würden, was aber meiner Meinung nach nicht zutrifft.

-----schnipp-----
#include <iostream
using namespace std;

int main()
{
typedef unsigned short ushort;
typedef unsigned long ulong;

ushort iSmall;
ulong iLarge;

const ushort iMAXSMALL = 65535;

cout << "Bitte eine kleine Zahl eingeben: ";
cin >> iSmall;
cout << "Bitte eine grosse Zahl eingeben: ";
cin >> iLarge;

cout << "Klein: " << iSmall << "...";

while(iSmall < iLarge && iLarge > 0 && iSmall < iMAXSMALL)
{
if (iSmall % 5000 == 0)
{
cout << ".";
}
iSmall++;
iLarge-=2;
}
cout << "nKlein: " << iSmall << " Gross: " << iLarge << endl;

return 0;
}
-----schnapp-----

Wenn ich die Bedingung "iSmall < iLarge" rausnehme, dann erscheint die
Meldung nicht Sad
Ich bin mir aber ziemlich sicher, dass ich die Variablen in den Zeilen 9
und 10 durch die Zeilen 6 und 7 (typedef) ganz klar als "unsigned"
deklariere.
Oder will mir der Compiler einfach nur sagen, dass ich "short int" und
"long int" vergleiche?!?

Wisst Ihr, was der Compiler dort genau anmeckert?

Die Warnung beim Vergleich von unsigned short und unsigned long ist
schlicht ein Bug. Das von dieser Art Warnung fokussierte Problem ist
folgendes: Die Konvertierungsregeln beim Vergleich verschiedener
ganzzahliger Typen koennen zu möglicherweise unerwarteten mathematisch
"falschen" Resultaten fuehren, wenn der signed-Typ einen negativen
Wert enthaelt, So ergibt

int i = -1;
unsigned u = 1;

i
i.a. nicht "wahr". Das Problem tritt dann auf, wenn im Zuge der
Konvertierung ein signed-Typ, der einen *negativen* Wert enthält,
implizit in einen unsigned-Typ gewandelt wird, und der negative
signed-Wert damit zerstört wird.

Bei ushort gewandelt. Diese sogenannten unaeren Konvertierungen erhalten
garantiert den Wert. Dann wird der resultierende positive int in ulong
gewandelt und die beiden ulongs werden verglichen. Damit gibt es
keinen Grund zu einer Warnung. Moeglicherweise betrachtet der Compiler
den Vergleich int <op> ulong *nach* der Zwischenkonventierung
ushort->int und erkennt hier ein mögliches Problem - was er aber nicht
sollte. Compiler sind eben auch Menschen ;-)

--
Horst

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Markus Schaaf
Guest





PostPosted: Tue Sep 07, 2004 7:39 am    Post subject: Re: Compilerfehler -> comparing signed and unsigned Reply with quote

"Falk Tannhäuser" <tannhauser86549spam (AT) free (DOT) fr> schrieb:

Quote:
Warum sollte der Compiler das machen?

Wegen §§ 5/9 und 4.5/1?

Darauf wollte ich hinaus. Am Ende der Promotion-Kette haben aber
beide Operanden wieder den gleichen Typ (hier »unsigned long«),
nicht einer »int« und der andere was anderes. Was soll das also
für eine Begründung dieser Vorzeichen-Warnung sein? Außerdem muß
solch eine Warnung natürlich vor jeder Promotion generiert werden.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Markus Schaaf
Guest





PostPosted: Tue Sep 07, 2004 7:44 am    Post subject: Re: Compilerfehler -> comparing signed and unsigned Reply with quote

"Bastian Blank" <usenet (AT) waldi (DOT) eu.org> schrieb:

Quote:
Seit wann ist in C++ eine allein stehende Zahl unsigned?

Falls Du eine Zahl ohne Suffix meinst: Auf einer 16-Bit-
Architektur z.B. ist das Literal »50000« »unsigned«.
Auch jede Oktal- und Hexadezimalzahl ist »unsigned«, wenn
sie nicht größer als »UINT_MAX« ist.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.