سؤال

وأنا لا أفهم لماذا هذا البيان في 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))

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top