mingw __int64 ? long long?

GeYe

Lt. Junior Grade
Registriert
Aug. 2002
Beiträge
486
Ich habe ein Problem mit C++ und MinGW. Ich brauche unbedingt einen 64 Bit-Datentyp, da ich die Filegröße von Daten bestimmen will.

Meine Berechnung steigt allerdings bei

Code:
unsigned __int64 filesize;

filesize = (high_order_value*(4294967295))+low_order_value;

aus. Da ich nur den Wert von low_order_value bekomme. Das interessante ist, dass es ohne Probleme kompiliert.

Ein unsigned long long bringt übrigens auch nichts :-(

Jemand eine Idee.
 
ueberpruefe doch mal high_order_value

high_order_value = 0;
filesize = (high_order_value*0xffffffff)+low_order_value;

filesize == low_order_value;
 
bei msvc++ sind die normalen operationen fuer files ja alle 32bit, da hab ich immer fuer
groessen folgendes gemacht

__int64 FileSize64( const char * szFileName )
{
struct __stat64 fileStat;
int err = _stat64( szFileName, &fileStat );
if (0 != err) return 0;
return fileStat.st_size;
}

aber bei minGW gibt es diese probleme normal nich. man muss da glaub irgendwas mit
"#define BIGFILES" machen.
 
Das Problem an der Berechnung ist, dass vermutlich high_order_value ein int ist und 4294967295 auch. int * int ergibt int, damit geht der "high order"-Teil flöten. Genaugenommen wäre das undefiniertes Verhalten. (Overflow) Behebung:

Code:
filesize = (static_cast<__int64>(high_order_value)*(4294967295))+low_order_value;

Du brauchst nicht beide Argumente zu casten. _int 64 * int ergibt __int64. + int macht immernoch __64, damit geht die Rechnung auf. :)

Gruß
 
hey 7H3 N4C3R,

deine erklärung klingt plausabel, das werde ich doch glatt mal testen. Darauf hätte ich auch selber kommen können. Schon mal großes Dankeschön für den Int.

Übrigens ja high_order_value ist ein unsigned long.

Naja zu früh gefreut, selbst folgendes tut nicht

#include <stdlib.h>
#include <stdio.h>


int main(int argc, char* argv[])
{
__int64 maxword = 4294967295;
__int64 high_order_value = 1;
__int64 low_order_value = 386990235;
__int64 filesize;

filesize = (high_order_value*(maxword))+low_order_value;
printf("Filesize: %lld - FileSize1 %lld - %lld - FileSize2 %lld \n",filesize,high_order_value,maxword,low_order_value);
}

Ausgabe: Filesize: 386990234 - FileSize1 1 - 1 - FileSize2 0
 
Zuletzt bearbeitet:
also Visiual Studio bringt das obere Beispiel mit der richtigen Ausgabe:

Code:
Filesize: 4681957530  - FileSize1 1 - 4294967295 - FileSize2 386990235

auch die Zuweisung

Code:
__int64	   maxword = 4294967296;
ist in MS:VS möglich.

Unter MinGW gibt es leider den unschönen Fehler
Code:
test.cpp:7: error: integer constant is too large for "long" type

Klar ist dadurch er interpretiert einen __int64 als long. Toll :D Hilft mir aber nicht ganz weiter

OK das tut jetzt mit MinGW...
Code:
unsigned long long 	maxword = 4294967296LL;
	
	if(high_order_value>=1)
	{
		filesize = (high_order_value*(maxword))+ low_order_value;
	} else {
		filesize = low_order_value;
	}

Eine Ausgabe darf man auch nur mit %I64d machen. Also etwas andere Implementierung als bei MS ;)
 
Zuletzt bearbeitet:
Über unterschiedliche Implementierungen darf man sich nicht wundern, wenn man sich außerhalb des Sprachstandards bewegt. ;) Was mit __int64 oder long long der Fall ist.

Achso, zu maxword = 4294967296;

Das gibt natürlich einen Fehler, da ein int auf einem 32-Bit-System maximal 2147483647 groß werden kann, und numerische Literale per Default (signed) int sind. Allerdings passt der Wert um genau 1 Bit auch nicht mehr in einen unsigned. Also scheint wohl die GNU-Variante mit 4294967296LL ganz sinnvoll zu sein. :)
 

Ähnliche Themen

Zurück
Oben