2012-03-08 8 views
9

कुछ अजीब व्यवहार मिला मैं सोच रहा था कि कोई मेरे लिए साफ़ कर सकता है या नहीं।PHP में हेक्स की नकारात्मकता, मजाकिया व्यवहार

इसे देखें

$hex = 0x80008000; 

print_r(decbin(intval($hex)) . '<br/>'); 
print_r(decbin($hex)); 

आउटपुट

10000000000000001000000000000000 
10000000000000001000000000000000 

जैसी उम्मीद थी।

लेकिन

$hex = 0x80008000; 

print_r(decbin(~intval($hex)) . '<br/>'); 
print_r(decbin(~$hex)); 

आउटपुट

1111111111111110111111111111111 
1111111111111111111111111111111 

क्यों बीच बिट स्विचिंग नहीं है जब $hex नकार दिया गया?

+0

पीएचपी किस संस्करण का उपयोग कर रहे हैं? दूसरा मामला मेरे लिए 5.3.6 –

+0

पर काम करता है मैं 5.3.8 चला रहा हूं और समस्या मौजूद है। – Pateman

+0

मैं उपयोग कर रहा हूँ 5.2.17 – Vigrond

उत्तर

0

यहां मेरे अपने प्रश्न पर एक शॉट देने वाला है।

हाँ यह 32-बिट/64-बिट अंतर है।

32-बिट सिस्टम में, आवश्यक फ्लोट बिट प्राप्त करने के लिए एक फ्लोट प्रकार को दो मेमोरी रिक्त स्थान लेना पड़ता है। पीएचपी डबल-परिशुद्धता का उपयोग करता है (http://en.wikipedia.org/wiki/Floating_point#IEEE_754:_floating_point_in_modern_computers देखें)

$ हेक्स एक फ्लोट प्रकार का मूल्यांकन करता है। अंतराल और डीकबिन फ़ंक्शंस इसे एक इंट प्रकार (ऊपर पहला उदाहरण)

दूसरे उदाहरण में हम डिकबिन का उपयोग करने से पहले बिटवाई ऑपरेटर का उपयोग नहीं कर रहे हैं। यह दो मेमोरी स्पेस डबल-प्रेसिजन फ्लोट में बिट्स को फ्लिप करता है, और उसके बाद int सेकेंड में परिवर्तित हो जाता है।हमें जो कुछ उम्मीद थी उससे अलग कुछ देना।

वास्तव में, अगर हम intval के अंदर() तो जैसे निगेट डाल:

$hex = 0x80008000; 

print_r(decbin(intval(~$hex)) . '<br/>'); 
print_r(decbin(~$hex)); 

हम

1111111111111111111111111111111 
1111111111111111111111111111111 

उत्पादन के रूप में मिलता है।

मैं काफी अच्छा अभी तक गणित के साथ इस साबित करने के लिए नहीं कर रहा हूँ (जो इस लेख http://en.wikipedia.org/wiki/Double_precision की मदद से पता लगा जा सकता है)। लेकिन हो सकता है जब मैं बाद में समय -_-

मुझे लगता है यह जानने के लिए कैसे संख्या कंप्यूटर में प्रतिनिधित्व कर रहे हैं तो हम इस तरह की विसंगतियों को समझते हैं और न उन्हें कीड़े कॉल कर सकते हैं बहुत महत्वपूर्ण है है।

-1

संभवतः एक मामले इस के अंतर्गत आने वाले:

php बिटवाइज़ ऑपरेटर्स पेज http://us3.php.net/manual/en/language.operators.bitwise.php

नहीं से

या ऑपरेटर (~) और नकारात्मक द्विआधारी संख्या के पूरक भ्रामक हो सकते हैं।

~ 2 = -3 क्योंकि आप सूत्र का उपयोग करें ~ एक्स = -x - 1 बिटवाइज़ एक दशमलव संख्या का पूरक संख्या का निषेध शून्य से 1.

नोट है: बस के लिए यहाँ 4 बिट्स का उपयोग कर नीचे दिए गए उदाहरण लेकिन हकीकत में PHP 32 बिट्स का उपयोग करता है।

एक नकारात्मक दशमलव संख्या में कनवर्ट (यानी: -3) बाइनरी में 3 कदम उठा लेता है: 1) में दशमलव संख्या के सकारात्मक संस्करण परिवर्तित बाइनरी (यानी: 3 = 0011) 2) flips बिट्स (यानी: 0011 1100 हो जाता है) 3) 1 (यानी: 1100 + 0001 = 1101)

आप सोच सकते हैं कि 1101 = -3 कैसे होता है। खैर PHP नकारात्मक बाइनरी संख्याओं को प्रस्तुत करने के लिए विधि "2 पूरक" का उपयोग करता है। यदि बाएं सबसे अधिक बिट 1 है तो बाइनरी संख्या ऋणात्मक है और आप बिट्स को फ्लिप करते हैं और 1 जोड़ते हैं। यदि यह 0 है तो यह सकारात्मक है और आपको कुछ भी करने की आवश्यकता नहीं है। तो 0010 सकारात्मक होगा 2. यदि यह 1101 है, तो यह नकारात्मक है और आप बिट्स को 0010 प्राप्त करने के लिए फ़्लिप करते हैं। 1 जोड़ें और आपको 0011 मिलते हैं जो -3 के बराबर है।

+0

मुझे नहीं लगता कि यह प्रश्न से संबंधित है। मेरी समझ से, 'अंतराल ($ हेक्स) '' हेक्स' के बराबर होना चाहिए, इसलिए मैं '~ अंतराल ($ हेक्स) === ~ $ हेक्स' की अपेक्षा करता हूं। –

+0

हाँ, मैं यहां कुछ भी परिवर्तित नहीं कर रहा हूं, बस बाइनरी प्रारूप में संख्याओं का प्रतिनिधित्व करता हूं। – Vigrond