Wieso sind Pointer vorzeichenbehaftet?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Wieso sind Pointer vorzeichenbehaftet?

Beitrag von STARGÅTE »

Frohe Weihnachten,

ich bin gerade etwas verwirrt (vermutlich, weil ich mich heute mit sowas nicht befassen sollte^^):
Weiso haben eigentlich Pointer auch ein Vorzeichen.

Negative Adresse gibt es nicht, und auch wenn intern die auch bei $90909090 (unter 32Bit) die richtige Adresse angesprungen wird, so gibt es in PureBasic ein Problem, wenn man es mit der Adresse $70707070 vergleichen würde.

Code: Alles auswählen

Procedure Test(*A, *B, C.l, D.l)
	If *A < *B
		Debug "Pointer, Schlecht"
	EndIf
	If C < D
		Debug "Long, OK"
	EndIf
EndProcedure

Test($90909090, $70707070, $90909090, $70707070)
Ich bin darauf gestoßen, weil ich eigentlich eine Schleife machen wollte der Art:

Code: Alles auswählen

While *Tiefer < *Hoeher
	PokeL(*Tiefer, 0)
	*Tiefer + 4
Wend
Wenn nun aber die höhere Adresse über $7FFFFFFF liegt, wird diese negativ, und die Schleife fängt garnicht erst an.

Nachdem ich in den ASM-Code geguckt habe, sehe ich das beim If in beiden Fällen mit JGE (Greater or Equal) rausgesprungen wird, obwohl ich gedacht hätte das man bei Pointern dann JAE (Above or Equal) benutzt.

Bedeutet das jetzt, das so manche Codes nicht mehr funktionieren würden, wenn die Speicheradresse wirklich mal über den 2GiB liegen würde?
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Re: Wieso sind Pointer vorzeichenbehaftet?

Beitrag von 7x7 »

STARGÅTE hat geschrieben:Frohe Weihnachten
ebenfalls 8)
STARGÅTE hat geschrieben:Weiso haben eigentlich Pointer auch ein Vorzeichen
Weil man mit Pointern nicht rechnet. Soviel zum Grundsatz.

Aber wie so immer gibt es Ausnahmen von der Regel (etwa um Distanzen im Speicher zu ermitteln)
Da ist -zugegeben- PB etwas neben der Spur. Intern wird nicht zwischen Pointern und Integern unterschieden. da kommt man dann nicht umhin, selbst ein kleines ASM-Inlay hinzulegen.
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Wieso sind Pointer vorzeichenbehaftet?

Beitrag von NicTheQuick »

Das ist ein schlechtes Argument. Man nimmt keinen Pointertyp um Distanzen im Speicher zu messen. Eigentlich sollten Pointer immer vorzeichenlos sein.
Außerdem rechnet man mit Pointern sehr wohl. Man addiert eine Distanz drauf oder zieht sie ab um zur nächsten Speicherstelle zu kommen. Und Vergleichsoperatoren für Pointer zu nutzen ist durchaus üblich. Lediglich Mulitplikationen und Divisionen mit Pointern machen keinen Sinn, genau wie alle anderen höheren Operationen.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: Wieso sind Pointer vorzeichenbehaftet?

Beitrag von PMV »

Da hab ich auch noch garnicht so wirklich drüber nach gedacht, aber bis
auf die neusten Variablentypen .u und .a sind ja alle anderen Vorzeichenbehaftet,
das gilt ja dann auch für Integer und Pointer. Das aber Pointer gerade zum
schnelleren Zugriff auf Speicherbereiche benutzt werden, also damit Rechungen
passieren, würde das tatsächlich zu Problemen führen. :shock:

32-Bit Anwendungen kommen aber unter Windows nicht über 2GB, gibt es solch
eine "künstliche" Grenze auch für Linux und Mac? Wenn nicht, müsste das
umgehend mal im englischen Forum mit Fred und Freak diskutiert werden. Das
würde die möglichkeiten von PB drastisch einschränken bis zu einem Update.
Aber in der Praxis hab ich damit noch keine Probleme gehabt ... doch bisher
war ich auch z.B. nur unter Windows und 32-Bit aktiv.

Und wie siehts bei 64-Bit Anwendungen aus? Wenn der eh nur bei 2^64/2 liegt,
wäre das so ok ... aber wenn nicht ... Englisches Forum :D

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Wieso sind Pointer vorzeichenbehaftet?

Beitrag von STARGÅTE »

Also ich habs jetzt mal spaßes halber probiert, einen Pointer zu erzeugen der über 2^31-1 liegt, es funktioniert einfach nicht:

Code: Alles auswählen

For n = 1 To 40
	Debug AllocateMemory(100*1000000)
	Delay(5000)
Next
33'423'392
133'431'328
233'439'264
333'447'200
433'455'136
533'463'072
633'471'008
733'478'944
833'486'880
933'494'816
1'033'502'752
1'133'510'688
1'233'518'624
1'333'526'560
1'433'534'496
1'533'542'432
1'633'550'368
1'733'558'304
0
0
0
Scheinbar kann man/ich doch rechts beruhigt an die Sache gehen.
Obwohl ich ja immer dachte 32Bit System können 4GB nutzen, gerade weil Pointer eigentlich unsign sind.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Wieso sind Pointer vorzeichenbehaftet?

Beitrag von NicTheQuick »

Unter einem 32-Bit Betriebssystem haben einzelne Prozesse normalerweise nur die Möglichkeit Speicher bis zu 2 GB zu allozieren. Insgesamt können aber mehrere Prozesse zusammen mehr als 2 GB nutzen. Mit dem richtigen 32-Bit Linux-Kernel kann man insgesamt auch mehr als 4 GB Arbeitsspeicher ansprechen. Das weiß ich aber nur vom Hören-Sagen. Eine verlässliche Quelle dazu habe ich gerade nicht zur Hand.

Dennoch finde ich es weiterhin problematisch, dass Pointer unter PB unsigned sind. Und zwar wegen den oben schon genannten Problemen. Aber warten wir mal die Feiertage ab. Dann wird sich bestimmt auch noch der ein oder andere fachkundige PB-ler dazu äußern.
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Re: Wieso sind Pointer vorzeichenbehaftet?

Beitrag von 7x7 »

NicTheQuick hat geschrieben:...dass Pointer unter PB unsigned sind
Verschrieben? Sie sind signed! Zumindest in der Darstellung nach aussen und in mathematischen Berechnungen, weil sie von PB wie Integer behandelt werden. Funktionieren tun sie aber auf alle Fälle, weil dem Prozessor die Definition von "signed" und "unsigned" völlig am A..... vorbeigeht. :mrgreen:
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: Wieso sind Pointer vorzeichenbehaftet?

Beitrag von PMV »

Der Test funktioniert unter Windows nicht. Prozesse haben
nen 2GB limit, und unter 64-Bit ... wer hat heute schon über 8 EiB? :lol:
Das müsste mal jemand mit Linux oder Mac testen. Und dann
müsste da auf nen Offset zugegriffen werden, um nen IMA zu erhalten
bei negativen Speicheradressen :wink:


MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Wieso sind Pointer vorzeichenbehaftet?

Beitrag von ts-soft »

PMV hat geschrieben:um nen IMA zu erhalten bei negativen Speicheradressen :wink:
Speicheradressen sind niemals Negativ, auch in PB nicht, egal wie das erste Bit in der Ansicht
interpretiert wird, hat dies jedoch keinerlei einfluss auf den richtigen Wert im Speicher.
Distanzen addieren usw. verfälscht zwar das visuelle Ergebnis, aber die Speicherstelle bleibt
korrekt, also einfach ignorieren und gut <) , mathematisch korrekte Ergebnisse anzeigen ist
hierbei doch nicht nötig.

Die CPU nutzt den 32- oder 64- Bit Wert, so wie er da steht und beachtet sowas wie Vorzeichen-Bit
sowieso nicht, weil das ja keinen Sinn machen würde. Wer unbedingt Speicherstellen darstellen möchte,
muß diese natürlich Maskieren.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Wieso sind Pointer vorzeichenbehaftet?

Beitrag von STARGÅTE »

Speicheradressen sind niemals Negativ, auch in PB nicht, egal wie das erste Bit in der Ansicht
interpretiert wird, hat dies jedoch keinerlei einfluss auf den richtigen Wert im Speicher.
Das ist natürlich richtig. Das hab ich ja auch am Anfang geschrieben, nur leider hab ich ab und zu halt sachen wie:

Code: Alles auswählen

*CurrentPoiter.Structure = *StartPointer
*EndPointer = *StartPointer + Length
While *CurrentPointer < *EndPointer
   ; Mache irgendwas
   ; *CurrentPointer\Blub ...
   *CurrentPointer + Step
Wend
in meinen Codes weil es einfach handlicher ist als:

Code: Alles auswählen

Position = 0
While Position < Length
   *CurrentPoiter.Structure = *StartPointer + Position
   ; Mache irgendwas
   ; *CurrentPointer\Blub ...
   Position + Step
Wend
Das die richtige Stelle angesprungen wird, weiß ich ja, nur leider könnte der Vergleich *CurrentPointer < *EndPointer irgendwann nicht hinhauen, weil für PB *EndPointer negativ sein könnte.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Antworten