[gelößt]C: pointer xor

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
wanne
Moderator
Beiträge: 7556
Registriert: 24.05.2010 12:39:42

[gelößt]C: pointer xor

Beitrag von wanne » 12.11.2012 17:34:05

Jetzt habe ich auch mal eine C-Frage. (Wir kapern jetzt das Debianforum und wandeln es zu einem C-Forum um :twisted: )
Ich habe folgende Anweisung (p und q sind vom Typ void*):

Code: Alles auswählen

p=(long)p^(long)q; 
Das funktioniert auf üblichen PCs. Ich würde das aber gerne allgemeiner machen. Also p und q verxoren auf der länge des pointers. (rein theoretisch könnte es ja sein, dass die Länge von pointern nichteinmal ein vielfaches von int ist. gibt es eine einfache Möglichkeit für sowas ohne bit für bit drüber zu fahren?
(Das gcc meint dass p^q nicht geht.)
Zuletzt geändert von wanne am 13.11.2012 04:16:29, insgesamt 1-mal geändert.
rot: Moderator wanne spricht, default: User wanne spricht.

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: C: pointer xor

Beitrag von Meillo » 12.11.2012 17:40:49

Beantworte folgende Frage: Was ist die semantische Bedeutung von ``Adresse XOR Adresse''?
Use ed once in a while!

wanne
Moderator
Beiträge: 7556
Registriert: 24.05.2010 12:39:42

Re: C: pointer xor

Beitrag von wanne » 12.11.2012 18:07:53

Meillo hat geschrieben:Beantworte folgende Frage: Was ist die semantische Bedeutung von ``Adresse XOR Adresse''?
vollständiger Teil:

Code: Alles auswählen

p=p^q;
q=p^q;
p=p^q;
Also gleichbedeutend mit

Code: Alles auswählen

void* r=p;
p=q;
q=r;
Nur eben auf einem Register weniger. (Es geht aber um's pinzip nicht nicht darum, dass der Code ne Nanosekunde schneller läuft. Weil unter guten Vorraussetzngen ein mal weniger auf den L1 Cache zugegriffen werden muss.)
rot: Moderator wanne spricht, default: User wanne spricht.

Benutzeravatar
format_c
Beiträge: 188
Registriert: 23.01.2008 14:24:17
Kontaktdaten:

Re: C: pointer xor

Beitrag von format_c » 12.11.2012 20:07:24

Also den Sinn habe ich auch noch nicht erkannt aber was ist das für ein sysTem bei dem der Datentyp long für Speicheradressen verwendet werden kann? Dachte immer int für 32 und long long int für 64 bit. Oder bin ich jetzt aufdem Holzweg?


Gruß Alex
[[ Black Holes are where God devided by 0 ]]

wanne
Moderator
Beiträge: 7556
Registriert: 24.05.2010 12:39:42

Re: C: pointer xor

Beitrag von wanne » 12.11.2012 20:12:56

format_c hat geschrieben:Oder bin ich jetzt aufdem Holzweg?
Bei nem Typischen amd64 System sind long long und long gleich groß und 64Bit. => mein long passt genausogut wie dein long long.
Die Windowsler machen das aber anders. Bei denen ist ein long 32 bit wie ein int.
Außerdem gab es Leute die gemeint haben ein pointer muss immer in ein int passen, weil das schon auf den 16Bit Systemen so war und deswegen int und long und long long 64bit lange gemacht haben. Das macht das gcc aber bwusst nicht mit.
Also nicht komplet auf dem Holzweg aber du merkst, es wird hässlich... Deswegen verwendet man am besten stdint.h. Wie schön, dass C uns wenigstens vorschreibt das ein long long nicht kürzer wie ein int sein darf sonst würde das bestimmt auch jemand machen.
Zuletzt geändert von wanne am 13.11.2012 04:12:34, insgesamt 1-mal geändert.
rot: Moderator wanne spricht, default: User wanne spricht.

owl102

Re: C: pointer xor

Beitrag von owl102 » 12.11.2012 21:39:07

wanne hat geschrieben:Die Windowsler machen das aber anders. Bei denen ist ein long 32 bit wie ein int.
...und da Windows ständig das Problem hat, daß Zeiger in Integers übergeben werden (Windows-Procedures haben halt nur 2 extra Parameter, wParam und lParam) und andersherum, hat MS dafür Typen wie z.B. LONG_PTR in den Tiefen von windows.h (vermutlich wintypes.h?) definiert. Siehe auch: http://msdn.microsoft.com/en-us/library/cc230349.aspx

wanne
Moderator
Beiträge: 7556
Registriert: 24.05.2010 12:39:42

Re: C: pointer xor

Beitrag von wanne » 13.11.2012 04:16:02

owl102 hat geschrieben:LONG_PTR
Das abslout richtige Stichwort. (zum googeln) Was ich suche ist uintptr_t! Das ist in der stdint.h drin und die ist in C99.
rot: Moderator wanne spricht, default: User wanne spricht.

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: C: pointer xor

Beitrag von Meillo » 13.11.2012 08:20:56

wanne hat geschrieben:
Meillo hat geschrieben:Beantworte folgende Frage: Was ist die semantische Bedeutung von ``Adresse XOR Adresse''?
vollständiger Teil:

Code: Alles auswählen

p=p^q;
q=p^q;
p=p^q;
Also gleichbedeutend mit

Code: Alles auswählen

void* r=p;
p=q;
q=r;
Nur eben auf einem Register weniger. (Es geht aber um's pinzip nicht nicht darum, dass der Code ne Nanosekunde schneller läuft. Weil unter guten Vorraussetzngen ein mal weniger auf den L1 Cache zugegriffen werden muss.)
Okay, das lasse ich gelten. ;-)
Use ed once in a while!

Antworten