Warum keine Warnung bei unterschiedlichen Varablengrößen



  • Hi,

    ich verwende Visual Studio 2008 mit folgendem C++ Code:

    #include <iostream>
    using namespace std;
    
    int main()
    {
    	short s = 10;
    	unsigned short us = 11;
    
    	int i = 32769;
    	unsigned int ui = 13;
    
    	long l = 14;
    	unsigned long ul = 15;
    
    	long long ll = 16;
    	unsigned long long ull = 17;
    
    	float f = 7.2f;
    
    	double d = 8.7;
    
    	char c = 'a';
    
    	s = i;  //Diese Zeile
    	cout << s;
    
    	return 0;
    }
    

    Warum gibt es bei der markierten Zeile keine Warnung des Compilers bei der Übersetzung, obwohl mit der Ausgabe von -32767 eindeutig zu erkennen ist, dass ein Überlauf stattgefunden hat? (0 Fehler, 0 Warnung(en))

    Nach dem wie ich es verstanden hatte, hätte doch ein expliziter Cast notwendig sein müssen 😕.



  • Du musst das Warning-Level umstellen, dann bekommst du auch eine Warnung:
    Warning 1 warning C4244: '=' : conversion from 'int' to 'short', possible loss of data Allerdings warnt er nicht vor einen Überlauf, sondern vor einem Informationsverlust.

    In Visual Studio solltest du das einstellen:
    Configuration Properties - C/C++ - Warning Level=Level4(/W4)

    Nimm aber nicht EnableAllWarnings , da bekommst du unter Umständen irgendwann Probelem, ich weiß nicht mehr genau wo das war. Auf jeden Fall erkennt er dann manchmal Warning, wo keine sind.



  • Im Übrigen hast du noch zwei Datentypen vergessen in deiner Liste:
    unsigned char
    signed char
    :p



  • Unter GCC ist das Flag -W-sign-conversion für obige Fälle da (nur so nebenbei).



  • Anfänger2012 schrieb:

    ich verwende Visual Studio 2008

    Sone schrieb:

    Unter GCC ...

    -1



  • In Visual Studio solltest du das einstellen:
    Configuration Properties - C/C++ - Warning Level=Level4(/W4)

    Ja! Jetzt funktioniert es so, wie ich es mir vorgestellt habe.


Anmelden zum Antworten