WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   C++ und ein problem mit __int64 (http://www.wcm.at/forum/showthread.php?t=69716)

it00x30 12.09.2002 16:59

C++ und ein problem mit __int64
 
hi,

microsofts compiler unterstützen den datentyp __int64 (also 8 byte)

so weit so gut, mein problem ist, dass ich diesen datentypen in ein file schrieben muss und keine ahnung habe wie, (printf("%d", i64XXX); konvertiert zu long und verfälscht so die zahl)

hat jemand eine idee, wie ich die acht byte in 2 longs (4byte) umwandeln kann, die jeweils die erste hälfte und die zweite hälfte des __int64 repräsentieren?

danke für die hilfe

0x0001 12.09.2002 17:10

ja mit shift right.

__int64 li;
long ll;
long lh;

ll = (long) li;
lh = (long) li >> 32;

Who-T 12.09.2002 17:14

hmm, über bitshifting wär eine möglichkeit, is aber sicher nicht die schönste

Code:

unsigned long first4bytes;
unsigned long second4bytes;
unsigned __int64 number; // dein wert

first4bytes = (0xFFFFFFFF00000000 & number) >> 32;
second4bytes = (0x00000000FFFFFFFF & number);

funkt nur bei unsigned so, ich hoff das stimmt so

Zecke 12.09.2002 17:15

is zwar schon länger her :-)
 
l_high = int64 / 1024;
l_low = int64 - (l_high*1024);

printf("&d&d",l_high,l_low);

vielleicht kompliziert, müsst oba gehn

0x0001 12.09.2002 17:19

Re: is zwar schon länger her :-)
 
Zitat:

Original geschrieben von Zecke
l_high = int64 / 1024;
l_low = int64 - (l_high*1024);

printf("&d&d",l_high,l_low);

vielleicht kompliziert, müsst oba gehn

öh nö geht nicht, denn
l_high = int64 /1024;
enspricht:
l_high = int64 >> 10;

is also ein bisserl zu wenig.

Zecke 12.09.2002 17:20

stimmt
 
i hob jo versucht mein post zu löschn, oba irgendwie geht des nit

hob do wos mit de bit verwechselt :D

Zecke 12.09.2002 17:22

Zitat:

Original geschrieben von Who-T
hmm, über bitshifting wär eine möglichkeit, is aber sicher nicht die schönste

Code:

unsigned long first4bytes;
unsigned long second4bytes;
unsigned __int64 number; // dein wert

first4bytes = (0xFFFFFFFF00000000 & number) >> 32;
second4bytes = (0x00000000FFFFFFFF & number);

funkt nur bei unsigned so, ich hoff das stimmt so

first4bytes brauchst ja nicht verunden oder? die fallen sowieso weg.

0x0001 12.09.2002 17:24

jo des geht irgendwie nur ganz kurz nachm post oder so, i a bisserl komisch.:)

generell wollte ich noch sagen:
Widermal ein feature von M$ mit dem es selber nicht klarkommt.

0x0001 12.09.2002 17:29

Zitat:

Original geschrieben von Zecke


first4bytes brauchst ja nicht verunden oder? die fallen sowieso weg.

Die anderen auch nicht da die shifts standardmässig mit 0 aufüllen.

_m3 12.09.2002 17:32

http://msdn.microsoft.com/library/de...html/int64.asp
Zitat:

In the printf family of run-time library functions, the format for optional prefixes includes I64, in addition to F, N, h, l, and L. For example, the following statement includes an example of a valid format string:

printf("%I64d", x);

When manipulating 64-bit integers, no special functions are necessary. Ordinary arithmetic operators and operations behave as expected.

Who-T 12.09.2002 17:45

ok, stimmt, müsst ohne dem ganzen & auch gehen

wobei _m3s lösung auch halbwegs elegant aussieht

it00x30 12.09.2002 19:20

danke erst einmal.

das mit dem format-string vom printf muss ich übersehen haben ...

die methode mit bitschift geht leider nicht (hab ich schon lange ausporbiert ...)

inzwischen hab ich aber herausgefunden wies geht (ganz einfach, wenn mans genau nimmt)

der fehler ist, dass man nicht im binärsystem denken darf, sondern im dezimalsystem:

__int64 i = 123456789876;

//der highPart
long high = i / 1000000000; //also 123

//der lowpart
long low = i % 1000000000; //also 456789876

ist doch ganz einfach oder?

irrsinn 13.09.2002 13:10

warum findet ihr bitshifting nicht elegant? is doch sicher die schnellste möglichkeit sowas zu tun?
vielleicht abgesehn von der eingebauten funktionalität, die _m3 ausgegraben hat.

it00x30 13.09.2002 14:45

elegant schon aber leider falsch ...

irrsinn 15.09.2002 22:00

wollt nur wissen, obs grundsätzlich was gegen bitshifting einzuwenden gibt, von dem ich noch nix weiß.

natürlich sollte mans nur verwenden, wenn man auch weiß um wie viele stellen und in welche richtung man shiften will.

it00x30 16.09.2002 08:38

im gegenteil, bitshifting bzw bitwise operations verwend ich sehr gerne - erstens gibts nichts schnelleres, und zweitens kann man viele sachen sehr elegant lösen (zb eine flag-variable, die 32 flags darstellt - wenn man das ding schön kommentiert ist es doch viel besser als 32 XYZFlag-variablen zu halten ...)

stz 16.09.2002 11:49

I64-Problem
 
Wenn man den expandierten Assemblercode des printf-Aufrufs mit dem richtigen Formatstring analysiert kommt man drauf, dass MS auch nur die shift-Methode verwendet. Aber wer kennt heute noch Assembler.
Stz.

it00x30 16.09.2002 13:05

mir kommt der verdacht, dass die shift-methode nur an mir gescheitert ist ... ;-)


Alle Zeitangaben in WEZ +2. Es ist jetzt 07:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag