لماذا هذا البيان صحيح في PHP؟
-
06-07-2019 - |
سؤال
وأنا لا أفهم لماذا هذا البيان في PHP صدى "whaaa؟ - يجب (0x0F | 0xF0)
0xFF
لا
if((0x0FFFFFFF | 0xF0FFFFFF) != 0xFFFFFFFF) echo 'whaaa?';
المحلول
ونتيجة لهذا السيناريو:
var_dump((0x0FFFFFFF));
var_dump((0xF0FFFFFF));
var_dump((0x0FFFFFFF | 0xF0FFFFFF));
var_dump((0xFFFFFFFF));
var_dump(((0x0FFFFFFF | 0xF0FFFFFF)) != (0xFFFFFFFF));
هو
int(268435455)
float(4043309055)
int(-1)
float(4294967295)
bool(true)
وPHP تحويل أرقام ست عشرية أكبر من 31 بت إلى العوامات، كما تم توقيع عدد صحيح، وبالتالي يمكن أن تعقد فقط 31 بت إيجابية.
والأرقام السداسية العشرية هي غير موقعة، وبالتالي فإن تحويل معنى.
وأول "أو" عملية تحويل تعويم إلى عدد صحيح، لأنه لا معنى لأداء و"أو" على تعويم. لذلك PHP تحويل تطفو إلى int لأو، والنتيجة هي عدد صحيح، ولكن تحويل عشري القادم هو تعويم، والقيم ليست هي نفسها.
لتحويل تطفو إلى عدد صحيح بطريقة أحادي المعامل، أو مع 0x0:
var_dump((0xFFFFFFFF | 0x0));
var_dump(((0x0FFFFFFF | 0xF0FFFFFF)) != (0xFFFFFFFF | 0x0));
والنتائج في
int(-1)
bool(false)
و-Adam
نصائح أخرى
واختبار ذلك من خلال كتابة var_dump((0x0FFFFFFF | 0xF0FFFFFF))
لا تنتمي إلى StackOverflow