Sie sind nicht angemeldet.
Lieber Besucher, herzlich willkommen bei: Aqua Computer Forum. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.
LiquidAcid
unregistriert
LiquidAcid
unregistriert
Zitat von »Sebastian«
Hallo,
mir würde spontan sowas dazu einfallen,
CHR --> INT
int Zahl;
unsigned char a,b,c,d;
// A = msb C = LSB
Zahl = ( (a<<24)|(b<<16)|
c<<
|
d) );
INT --> CHR
int Zahl;
unsigned char a,b,c,d;
// A = msb C = LSB
a= (zahl>>24);
b= (zahl<<&(zahl>>24); // erst nach lins schieben um die MSB zu löschen dann nach rechts um in 8 bit zu kommen
c= ..
d...
-------------------------------------------------
in ANSI C funtioniert das , da C ja eine untermenge von C++ ist sollte es auch in C++ funkt. ,.. das einzige problem ist das diese routien von der implementation des Compilers abhängen und unter umständen nicht auf eíner 64bit maschiene oä. laufen.
MfG
Sebastian
LiquidAcid
unregistriert
Zitat von »cobra224«
Hi,
ich würde es ein bisschen wie LiquidAcid machen, nur schneller.
Casting von int nach char:
int iInteger = 0;
char* pCharToInteger = &iInteger;
Casting von char nach int:
char cCharInteger[sizeof(int)];
int* pInteger = cCharInteger;
Natürlich sollte beim Senden die Länge des Integers berücksichtigt werden. Somit sind für ein Int auf jeden Fall 4 chars zu senden.
mfg,
cobra224
LiquidAcid
unregistriert
Zitat von »cobra224«
Was nützt den das Anlegen eines neuen Char-Feldes?
Nach meinem Erinnerungsvermögen muß dem Win32API od. MFC Befehl eh ein Char-Pointer übergeben werden.
Ausserdem liegt der Vorteil im Casting darin, daß du nicht eine weitere Variable mit Werten anlegen mußt.
Desweitern dauert das Shiften auf eine neue Var länger als nur einen Pointer zu verweisen. Es wird nur die Adresse des Char-Feldes dem Int zugewiesen und das macht der Compiler.
mfg,
cobra224
![]() |
Quellcode |
1 2 |
#define PI 3.14159 float val = bla_bla / PI; |
Zitat von »LiquidAcid«
Full ACK, besonders wenn die Zuweisung ungeprüft stattfindet.
EDIT: -> C Wars - Return of the wild pointer ;D
EDIT2: Jemand eine Ahnung ab welcher Optimierungsstufe Divisionen mit konstanten Variablentypen in Multiplikationen mit dem reziproken Wert umgewandelt werden?
Also wenn ich jetzt folgendes schreibe
![]()
Quellcode
1 2 #define PI 3.14159 float val = bla_bla / PI;
Dann wär man ja schön doof, wenn man die Division da so einfach stehen lassen würde. Das verbrät ja Takte en masse.
Also wann fudelt der Compiler das um?
LiquidAcid
unregistriert
Zitat von »cobra224«
Ich vermute, daß der Compiler beim Übersetzen dies direkt optimiert. Hängt wahrscheinlich von der Optimierungseinstellung des Compilers ab.
Beim MS Studio ist es eine Grundeinstellung das Konstanten in Verbindung mit Operatoren optimal compiliert werden.
Aber 100% bin ich mir nicht sicher.
mfg,
cobra224
EDIT: -> C Wars - The NULL-Pointer strikes back![]()
LiquidAcid
unregistriert
![]() |
Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
void special::printMHz() { DWORD value0 = 0; DWORD value1 = 0; DWORD value2 = 0; DWORD value3 = 0; __asm("rdtsc"); __asm("movl value0, %eax"); __asm("movl value1, %edx"); _sleep(1000); __asm("rdtsc"); __asm("movl value2, %eax"); __asm("movl value3, %edx"); value0 = value2 - value0; value1 = value3 - value1; std::cout << "CPU clock is: " << double(value0 + (value1 * 4294967296)) * 0.000001; } |
-