2016-10-09 2 views
-5

Ich habe eine Operation in C++ getan auf der Timer-Struktur von Linux durch die Schnittstelle "clock_gettime (CLOCK_MONOTONIC, & Current)"Addition zwischen Integer und Float .... was zu einem Null

#include <iostream> 
#include <time.h> 

int main() 
{ 
    struct timespec CurrentTime; 
    CurrentTime.tv_sec = 28220; 
    CurrentTime.tv_nsec = 461189000; 

    unsigned long long TimeNow; 
    TimeNow = (28220 * 1000000) + (461189000 * 0.001); 

    std::cout << TimeNow; 
} 

noch das Ergebnis immer TimeNow als Null geben.

Ich würde mich freuen, wenn eine Antwort auf diese Frage oder eine Führung zu folgen hat. Es wurde GCC Compiler getan mit

-Code snipped hier werden konnte http://rextester.com/XRR83683

+2

Anstatt Bits von C++ - Code in die ganze Frage zu streuen, wie wäre es mit einem einzigen [MCVE]? –

+0

[Works für mich] (http://rexttester.com/XSP25641) –

+0

Vielen Dank Igor, versuchen Sie den Wert anstelle der Variablen zu ersetzen, würde es zu 0 führen http://rextester.com/XRR83683 – AYZAB

Antwort

0

In der Zeile:

TimeNow = (28220 * 1000000) + (461189000 * 0.001); 

der (28220 * 1000000) Teil berechnet int s verwendet wird, und (mit 32-Bit-int) Überläufe geben einen falschen Wert (wahrscheinlich -1844771072).

Der (461189000 * 0.001) Teil berechnet double s verwendet wird, weil das 0.001 Doppelkonstante 461189,0 als double geben.

Die beiden werden dann zusammenaddiert, einen negativen double Wert geben ... wenn die negativen double-unsigned long long für die Zuordnung zu TimeNow umgewandelt wird, es wird als 0 umgewandelt, wahrscheinlich, weil das ist der nächste Wert in seinem Bereich zu einem negative Zahl. Dies unterscheidet sich von der Konvertierung eines negativen Integer-Typs in unsigned, der "umher" gehen würde.

+0

Danke für die Antwort, es macht jetzt wirklich Sinn für mich (Am Ende ist die Frage nicht trivial, viele Leute, die keine klare Antwort haben, stimmten es ab :)) Aber deine Antwort führt mich zum zweiten Teil der Frage: Warum funktioniert es gut mit Variablen wie gezeigt [Link] (http://realtextester.com/EIUEQ62755) hier – AYZAB

+0

@AhmedYzab das ist, weil auf dieser Implementierung, "time_t" (was ist der Typ von 'CurrentTime.tv_sec') ist breiter als 32-Bit, so dass die Multiplikation auch im breiteren Typ durchgeführt wird und nicht überläuft. – Dmitri

+0

Tausend Dank – AYZAB

Verwandte Themen