Verengung der Konvertierung von unsigned auf double

Verengung der Konvertierung von unsigned auf double


static_assert(sizeof(unsigned) == 4, ":(");
static_assert(sizeof(double) == 8 ,":(");
unsigned u{42};
double x{u};

g++ 4.7.1 beschwert sich über diesen Code:


warning: narrowing conversion of 'u' from 'unsigned int' to 'double' inside { }

Warum ist dies eine einschränkende Konvertierung? Ist nicht jeder unsigned perfekt darstellbar als double ?


Antworten:



Denn die Definition beinhaltet (mit meiner Betonung):



u ist kein konstanter Ausdruck, also eine einschränkende Konvertierung, ob alle möglichen Werte des Quelltyps im Zieltyp darstellbar sind.



Das ist die definierte Implementierung. Im allgemeinen Fall von 32-Bit unsigned und double bei einer 52-Bit-Mantisse ist das der Fall; aber einige Implementierungen haben größere unsigned und/oder kleiner double Darstellungen, sodass Code, der von dieser Annahme abhängt, nicht portierbar ist.


Einige Code-Antworten


static_assert(sizeof(unsigned) == 4, ":(");
static_assert(sizeof(double) == 8 ,":(");
unsigned u{42};
double x{u};
warning: narrowing conversion of 'u' from 'unsigned int' to 'double' inside { } 
Ilyas-iMac:TestC++11 sandye51$ cat main.cpp
int main() {
static_assert(sizeof(unsigned) == 4, ":(");
static_assert(sizeof(double) == 8 ,":(");
constexpr unsigned u{42};
double x{u};
return 0;
}Ilyas-iMac:TestC++11 sandye51$ gcc -o main main.cpp -std=c++11 Ilyas-iMac:TestC++11 sandye51$