दिलचस्प पोस्ट
गेट मौजूदा रेपो को एक नया और अलग रिमोट रेपो सर्वर पर रखता है? एफपीएमसीआईजी झंडा क्या करता है? फेसबुक ईमेल फील्ड रिटर्न रिक्त (भले ही "ईमेल" की अनुमति सेट और स्वीकार्य हो) मेकफाइल में उपनिर्देशिका के स्रोत MongoDB – एक संग्रह में प्रति समूह अधिकतम विशेषता के साथ दस्तावेज़ प्राप्त करें एसिंक्रोनस / पृष्ठभूमि थ्रेड स्थिति की निगरानी कैसे करें और JSF घटक में नोटिफिकेशन प्राप्त करें list.clear () बनाम सूची = नया ArrayList <Integer> (); किसी सेवा द्वारा उपयोग की जाने वाली एक नेटवर्क ड्राइव को मैप करें एंड्रॉइड: कर्सर एडाप्टर, लिस्ट्यूव्यू और चेकबॉक्स पायथन स्रोत कोड से यूएमएल आरेख को बनाने का सबसे अच्छा तरीका क्या है? मान्य करें कि समाप्ति तिथि, jQuery के साथ प्रारंभ तिथि से अधिक है जावास्क्रिप्ट फाइल एपीआई का उपयोग कर छवि आयाम प्राप्त करना विशेषाधिकारों को ऊपर उठाने का उपयोग UseShellExecute = false के साथ काम नहीं करता है Excel में एक कॉलम में अद्वितीय मानों की गणना करें शीर्षलेख फ़ाइलों के बीच चक्रीय निर्भरता

PHP पूर्णांक ओवरफ़्लो को बल दें

हमारे पास कुछ पूर्णांक अंकगणित है, जो कि ऐतिहासिक कारणों के लिए PHP पर समान कार्य करना है क्योंकि यह कुछ स्थिर रूप से टाइप की गई भाषाओं में करता है चूंकि हम अंतिम रूप से PHP को अपग्रेड करते थे, इसलिए अतिप्रवाह पूर्णांक के लिए व्यवहार बदल गया है। मूल रूप से हम निम्नलिखित सूत्र का उपयोग कर रहे हैं:

function f($x1, $x2, $x3, $x4) { return (($x1 + $x2) ^ $x3) + $x4; } 

हालांकि, रूपांतरण के साथ भी:

 function f($x1, $x2, $x3, $x4) { return intval(intval(intval($x1 + $x2) ^ $x3) + $x4); } 

मैं अभी भी पूरी तरह गलत नंबर के साथ समाप्त कर रहा हूँ …

उदाहरण के लिए, $ x1 = -1580033017, $ x2 = -2072974554, $ x3 = -1170476 9 76) और $ x4 = -1007518822 के साथ, मैं -30512150 PHP और 1617621783 में सी # में समाप्त होता है।

बस $ x1 और $ x2 जोड़कर मुझे सही जवाब नहीं मिल सकता है:

सी # में मैं मिलता है

 (-1580033017 + -2072974554) = 641959725 

PHP में:

 intval(intval(-1580033017) + intval(-2072974554)) = -2147483648 

जो समान है:

 intval(-1580033017 + -2072974554) = -2147483648 

मैं एक "इंटीग्रो ओवरफ्लोऐड" फ़ंक्शन या कुछ चीज़ों को लिखने में कोई दिक्कत नहीं करता, लेकिन मैं यह नहीं समझ सकता कि कैसे (-1580033017 + -2072974554) बराबर 641959725. (मुझे पता है कि यह है -2147483648 + (2 * 2 ^ 31) , लेकिन -2147483648 + 2 ^ 31 -1505523923 है जो Int.Min से अधिक है, तो आप 2 * 2 ^ 31 और न 2 ^ 31 क्यों जोड़ते हैं?)

किसी भी सहायता की सराहना की जाएगी…

वेब के समाधान से एकत्रित समाधान "PHP पूर्णांक ओवरफ़्लो को बल दें"

इसलिए मैंने इस समस्या का समाधान किया, और PHP के बारे में बहुत कुछ खोज लिया (कम से कम जिस तरह से यह पूर्णांक ओवरफ़्लो को संभालता है)।

1) यह पूरी तरह से एक क्रॉस पर निर्भर करता है कि किस प्लेटफ़ॉर्म पर मशीन चल रही थी, PHP का संस्करण, चाहे वह सुहोसिन कठोर पीएचपी चल रहा था, और कितने बिट्स (32 या 64) के लिए संकलित किया गया था। 6 मशीनें जिस तरह से मुझे उम्मीद थी (जो वास्तव में गलत थी, उनके प्रलेखन के अनुसार कम से कम गलत था) और 3 मशीनें एक तरह से बर्ताव करती थीं, मैं अभी भी समझा नहीं पा रहा हूं, और 3 मशीनें उस आचरण के अनुसार बर्ताव करती हैं जो अंतराल के आदेश में होती हैं प्रलेखन।

2) Intval PHP_MAX_INT जब int> PHP_MAX_INT (नहीं int और 0xffffffff) वापस जाने वाला है, लेकिन यह केवल PHP4 और PHP5 के कुछ संस्करणों पर होता है PHP के अलग-अलग संस्करणों को विभिन्न मूल्यों पर वापस लौटाते समय int> PHP_MAX_INT।

3) निम्न कोड 3 अलग-अलग परिणाम वापस कर सकते हैं (1 देखें):

 <?php echo "Php max int: ".PHP_INT_MAX."\n"; echo "The Val: ".(-1580033017 + -2072974554)."\n"; echo "Intval of the val: ".intval(-3653007571)."\n"; echo "And 0xffffffff of the val: ".(-3653007571 & 0xffffffff)."\n"; ?> 

यह वापस लौट सकता है (जो मकसद के लिए सही लगता है लेकिन 0xffffff के लिए गलत है)

 Php max int: 2147483647 The Val: -3653007571 Intval of the val: -2147483648 And of the val: -2147483648 

और यह लौटा सकता है (जो अंतराल के लिए PHP प्रलेखन के विपरीत है):

 Php max int: 2147483647 The Val: -3653007571 Intval of the val: -641959725 And of the val: -641959725 

और 64 बिट मशीनों पर यह रिटर्न (जो सही है):

 Php max int: 2147483647 The Val: -3653007571 Intval of the val: -3653007571 And of the val: -641959725 

उपाय

किसी भी तरह, मुझे एक ऐसे समाधान की जरूरत है जो इन सभी प्लेटफॉर्म पर काम करे, और किसी विशेष मैक्स इंट के साथ संकलित PHP के एक विशेष संस्करण के quirks पर निर्भर न हो। इस प्रकार मैं निम्नलिखित क्रॉस-पीएचपी तीसरा दो बिटविन्टल समारोह के साथ चलती हूं:

 function thirtyTwoBitIntval($value) { if ($value < -2147483648) { return -(-($value) & 0xffffffff); } elseif ($value > 2147483647) { return ($value & 0xffffffff); } return $value; } 

टिप्पणी

मुझे लगता है कि पीएचपी के डिजाइनरों ने यह कहा होगा कि एक 32 बिट या 32 बिट या 64 बिट मशीन (उदाहरण के लिए डॉटनेट सीएलआर की तरह) पर चल रहा है, कोई अंतर नहीं है, और इसे बेतरतीब ढंग से अपन्वेट नहीं किया है फ्लोट बिट्स की संख्या पर निर्भर करता है जो PHP के तहत कंपाइलर है

यदि आप 32 और 64 बिट प्लेटफार्मों पर 32-बिट तीव्रता के लिए 100% कार्य समाधान चाहते हैं, तो मैं आपको निम्न समाधान का उपयोग करने का सुझाव देता हूं:

 function intval32bits($value) { $value = ($value & 0xFFFFFFFF); if ($value & 0x80000000) $value = -((~$value & 0xFFFFFFFF) + 1); return $value; } 

आंतरिक रूप से, PHP अधिकांश संख्याओं के लिए एक "पूर्णांक" प्रकार का उपयोग करता है। हालांकि, ये केवल इतने दूर जाते हैं: यदि आप बड़े पूर्णांक में एक बड़ा पूर्णांक जोड़ते हैं, तो PHP देखेगा कि परिणाम एक सामान्य पूर्णांक में फिट होने के लिए बहुत बड़ा है और इसे एक अस्थायी बिंदु संख्या में निर्दिष्ट करेगा। फ़्लोटिंग-पॉइंट नंबर (फ़्लोट्स) स्वयं केवल इतना उच्च जाता है, और सोलह अंक के अंक के आसपास एक बिंदु होता है जहां PHP पूरी तरह से प्लॉट को खो देता है

मनमाना-सटीक गणित का उपयोग करने का एक विकल्प है जो किसी भी आकार और सटीक संख्याओं का समर्थन करता है, जो स्ट्रिंग के रूप में प्रदर्शित होता है । यहां अधिक देखें: http://us2.php.net/bc

मुझे लगता है कि यह PHP में पूर्णांक के साथ ऐसा करने के लिए हो सकता है कि सी # के रूप में संदिग्ध 32 बिट के रूप में वे डिफ़ॉल्ट रूप से 32 बिट पर हस्ताक्षर किए गए हैं

आप सामान्य 31-32 बिट्स की सीमा के किनारे पर खेल रहे हैं।

कृपया PHP मैनुअल में अतिरिक्त दस्तावेज़ीकरण देखें:

http://www.php.net/manual/en/language.types.integer.php

एक पूर्णांक का आकार प्लेटफॉर्म पर निर्भर है, हालांकि लगभग दो अरब का अधिकतम मूल्य सामान्य मान है (जो कि 32 बिट्स पर हस्ताक्षर किए गए हैं)। PHP अहस्ताक्षरित पूर्णांक का समर्थन नहीं करता है पूर्णांक आकार स्थिर PHP_INT_SIZE, और PHP 4.0.0 और PHP 5.0.5 के बाद से लगातार PHP_INT_MAX का उपयोग करके अधिकतम मूल्य निर्धारित किया जा सकता है।

यह काम करेगा?

 echo (-1580033017 + -2072974554) & 0xffffffff 

सामान्य करने के लिए, आप कर सकते हैं (किसी भी वाक्यविन्यास त्रुटियों को क्षमा करें, मैंने लंबे समय तक PHP को छुआ नहीं है):

 function s32add($a, $b) { return ($a + $b) & 0xffffffff; } 

PHP के अपने संस्करण संख्या की जांच करें – मेरा मानना ​​है कि यह संभव है कि आप विभिन्न प्रकार के PHP के विभिन्न संस्करणों के साथ मिल सकें, जो कि लंबे इंटिजर्स के लिए अलग-अलग समर्थन हो सकता है मुझे विश्वास है कि PHP के 5 संस्करणों में पिछले एक में लंबे पूर्णांक के साथ एक बग था।

संस्करण PHP 5.2.0 में – इसका उत्तर बिल्कुल वही है जैसा कि आपने सी #

1617621783,

आपके ऊपर दिए गए सटीक फ़ंक्शन का उपयोग करना

आप आसानी से अपने संस्करण संख्या को खोजने के लिए phpinfo () कमांड का उपयोग कर सकते हैं।

 $x1 = -1580033017; $x2 = -2072974554; $x3 = -1170476976 ; $x4 = -1007518822; echo f($x1, $x2, $x3, $x4); function f($x1, $x2, $x3, $x4) { return intval(intval(intval($x1 + $x2) ^ $x3) + $x4); }