Probleme mit Zuweisungsoperator

LongDonJohn

Mitglied
Hallo zusammen,

ich habe ein Script, in dem zwei Variablen durch ^= also dem XOR Operator bearbeitet werden. Nun habe ich aber das Problem, dass unterschiedliche Server hier unterschiedliche Ergebnisse liefern und ich kann keinen Grund dafür finden. Ist das vielleicht ein Problem mit der Serverkonfiguration?

Hoffe, jemand weiß das Hilfe oder nen Tip!

Vielen Dank im Voraus! - John
 
Ja, habe ich. Hier ein Beispiel:

PHP:
$a = -5665460319;
$b = 150776;
$a ^= $b;
echo $a;

Auf meinem lokalen Server liefert dieses Skript -1370643623 als Ergebnis, auf meinem Online-Server kommt als Ergebnis: -2147332872.

Und ich habe nicht mal ansatzweise eine Idee, warum das so ist...
 
XOR ist doch kein Zuweisungsoperator, sondern ein logischer Operator?

Hier mal ein Beispiel aus den Zitaten von php.net (sämtliche logischen Operatoren)

PHP:
;;;;;;;;;;;;;;;;;;;;;;;;;
; P1 P2; And; OR  ; XOR ;
;;;;;;;;;;;;;;;;;;;;;;;;;
; V  V ; V  ; V   ; F   ;
; V  F ; F  ; V   ; V   ;
; F  V ; F  ; V   ; V   ;
; F  F ; F  ; F   ; F   ;
;;;;;;;;;;;;;;;;;;;;;;;;;

<?php

$a = 2;
$b = 3;
$c = 6;

print !($a > $b && $b < $c);// true

print (($a > $b) and ($b < $c));// false

print ($a == $b or $b < $c); // true

print $a == $b || $b < $c; // true

$x = $a < $b; //$x = true

$y = $b === $c; //$y = false

print  $x xor $y; // true

?>

Und die Beschreibung für xor:
Example:
$a xor $b
Name:
Xor
Result:
TRUE if either $a or $b is TRUE, but not both.

Deine Anwendung will mir nicht so wirklich einleuchten.
 
Gut, dann ist XOR halt ein logischer Operator - aber das bringt mich der Lösung meines Problems kein Stück weiter!

Nimm es bitte als gegeben hin, dass ich das genau so brauche, wie ich es beschrieben habe. Die Frage ist: warum liefert zwei unterschiedliche Server zwei unterschiedliche Ergebnisse auf das selbe Skript...
 
Gut, ich glaube ich habe die Lösung.

Xor ist ein logischer Operator.

"^=" ist aber nicht direkt xor sondern Bit Zuweisungsoperator xor.

PHP:
$a = -5665460319;
$b = 150776;
$a xor $b;
echo $a;
Sollte immer "-5665460319" ergeben.

PHP:
$a = -5665460319;
$b = 150776;
$a ^= $b;
echo $a;
Siehe auch: Bit-Operatoren

Die unterschiedlichen Ergebnisse könnten mit der unterschiedlichen Umgangsweise von Windows und Linux zusammenhängen?
Wobei ich mir da ziemlich unsicher bin.
 
xor liefert leider ein anderes Ergebnis als ^=. Allerdings auch auf beiden Servern unterschiedliche Ergebnisse.

Das Problem scheint darin zu liegen, dass $a negativ ist. Sind beide Werte positiv, liefern auch beide Server das gleiche Ergebnis. Was kann ich also tun? Ich habe folgendes probiert:

PHP:
$a = -5665460319;
$b = 150776;

$a = intval($a);
$b = intval($b);

$a ^= $b;
echo $a;

um sicher zu gehen, dass beider Werte wirklich Integerwerte sind - hat aber nichts gebracht...
 
Bei mir siehts so aus:

PHP:
<?php

$a = -5665460319;
$b = 150776;

$a = intval($a);
$b = intval($b);

$a ^= $b;
echo $a;  
?>
Ergebnis: -1370643623 (Windows)
Ergebnis: -2147332872 (Linux)

Gleiche Ergebnisse erziele ich so:

PHP:
<?php

$a = "-5665460319";
$b = "150776";

$a = intval($a);
$b = intval($b);

$a ^= $b;
echo $a;  
?>

Wodran das liegt... Keine Ahnung. Spontan würde ich vermuten, das PHP unter Windows negative Zahlen nicht richtig typisiert o. ä.

Mal folgendes probiert:

PHP:
echo $a xor $b;

echo() dürfte da gar nichts ausgeben, print sollte das gleiche ausgeben wie:
PHP:
$a ^= $b;
echo $a;
 
Zuletzt bearbeitet:
Ja, ich bekomme die gleichen Zahlen wie du, Felix.

Da bin ich ja schon mal froh, dass meine Ergebnisse nachvollziehbar sind und es scheinbar an dem Unterschied zwischen Linux und Windows liegt. Die Frage ist nur: liefert Windows das "falsche" Ergebnis oder Linux. Denn mit dem Ergebnis, das Windows liefert funktioniert das Skript und wenn $a und $b positiv sind liefern beide das gleiche Ergebnis. Eben das, welches Windows auch mit negativem $a liefert nur mit umgekehrtem Vorzeichen.

Also würde ich mal frech behaupten, dass Linux hier falsch rechnet... Ob das Problem bei den PHP - Entwicklern bekannt ist?
 
Zurück