5

ich http://www.cplusplus.com/doc/tutorial/typecasting/ lese. Es besagt, dass:Konvertierung zwischen numerischen Typen von derselben Art

  • Andernfalls, wenn die Umwandlung zwischen numerischen Typen von derselben Art (integer-to-Integer- oder Gleitkomma-to-floating) ist, die Umwandlung gültig ist, aber der Wert ist implementierungsspezifisch (und möglicherweise nicht portabel).

Aber ich habe nicht wirklich verstehen, was das obige Zitat zu sagen bedeutet? Kann jemand das bitte anhand eines einfachen Beispiels erklären? Warum führt die Konvertierung zwischen gleichartigen numerischen Typen zu umsetzungsspezifischen Werten? Was ist der Grund?

Antwort

5

ist das folgende Beispiel Lassen Sie betrachten:

long long int lli = 5000000000; 
    long int li; 
    int i; 
    li = lli; 
    i = li; 

können Sie die Werte von lli, li und i vorhersagen? Oder ob li und i den gleichen Wert haben?

Antwort ist - Werte auf der Anzahl von Bytes für jeden Typ zugeordnet abhängen! I.e. in einigen Fällen int ist gleich long int, für andere long int ist gleich long long int, aber im Allgemeinen long er Typen können einfach länger sein. Ähnlich (im Sinne der Speichergröße) für float, double und long double.

+0

Also, ist es möglich, dass long nicht größer ist als int auf Einige der C++ - Implementierung? Kennst du eine solche Implementierung? – Destructor

+2

@PravasiMeet, die tatsächlich die gemeinsame Fall ist. Visual Studio x86 und x64 und gcc x86 haben sizeof (long) == sizeof (int), wenn ich mich nicht irre und ich wäre nicht überrascht, wenn clang das Gleiche tun würde. – Pixelchemist

+0

@Pixelchemist: ja gcc 5.2.0 und 3.5.0 Klirren tat das gleiche. Siehe Live-Demo http://melpon.org/wandbox/permlink/IsGDktKO5VUBY0KV & http://melpon.org/wandbox/permlink/6icDnbxu4hAIkwMN. Ich habe 5000000000 als Ausgabe 3 Mal bekommen. Aber wenn ich es auf http://webcompiler.cloudapp.net/ ausführe gibt es mir 5000000000 705032704 705032704 als Ausgabe. Ich hoffe, der ursprüngliche Verfasser der Antwort fügt diese Links in seine Antwort ein. – Destructor

1

Das Snippet bezieht sich auf das Einschränken von Konvertierungen zwischen Integral- und Gleitkommatypen. Das heißt, dass eine Konvertierung zwischen ganzzahligen Typen oder zwischen Fließkommatypen gültig ist, der resultierende Wert wird jedoch als Implementierung definiert.

als Beispiel die folgenden Code berücksichtigen:

#include <iostream> 
#include <limits> 

int main() { 
    long long lgm = std::numeric_limits<long long>::max(); 
    std::cout << std::hex << lgm << std::endl; 
    int i = lgm; 
    std::cout << std::hex << i << std::endl; 

    long double ldb = std::numeric_limits<long double>::max(); 
    std::cout << std::hex << ldb << std::endl; 
    double db = ldb; 
    std::cout << std::hex << db << std::endl; 
} 

Output:

7fffffffffffffff 
ffffffff 
1.18973e+4932 
inf 

Wie man der Maximalwert von long long integer sehen kann, die Kapazität einer Ebene ganze Zahl überschreitet. Allerdings können Sie eine long long auf eine int konvertieren (das heißt die Umwandlung gültig ist), aber aufgrund der Tatsache, dass die int nicht den Maximalwert eines long long halten kann, es kann keine genaue Umwandlung sein. Somit muss der Wert der resultierenden int durch die Implementierung entschieden werden. Gleiches gilt für die Umrechnung zwischen long double und double.

Verwandte Themen