2016-09-06 3 views
13

में बचा रहा डगलस Crockford की किताब पढ़ रहा हूँ है - जावास्क्रिप्ट अच्छा भागों - और वे कहते हैं:कैसे छोटे पूर्णांक अतिप्रवाह जावास्क्रिप्ट

जावास्क्रिप्ट एक संख्या प्रकार है। आंतरिक रूप से, इसे 64-बिट फ्लोटिंग पॉइंट के रूप में दर्शाया जाता है, जो जावा के डबल के समान होता है। अधिकांश अन्य प्रोग्रामिंग भाषाओं के विपरीत, कोई अलग पूर्णांक प्रकार नहीं है, इसलिए 1 और 1.0 समान मान हैं। यह एक महत्वपूर्ण सुविधा है, क्योंकि कम पूर्णांकों में अतिप्रवाह की समस्याओं को पूरी तरह से परहेज कर रहे हैं तो एक विवरण का एक सा चाहते हैं अन्य भाषाओं के साथ बहुत ज्यादा परिचित है ...

मैं नहीं हूँ। मैं समझ सकता हूं कि 64 बिट क्यों मदद करता है लेकिन उसका बयान फ्लोट्स और युगल की कमी पर लागू होता है।

जेएस में नहीं होने वाली छोटी पूर्णांक ओवरफ्लो स्थिति का एक उदाहरण (छद्म कोड शायद) क्या होगा?

+1

पूर्णांकों से हो सकता है - (2^53 - 1) (2^53 - 1) को .. प्रभावी रूप से एक पर हस्ताक्षर किए 54bit पूर्णांक (लेकिन वास्तव में नहीं, लेकिन यह प्रासंगिक नहीं है) ... लघु पूर्णांक 16 बिट हैं ... 54 बिट 16 बिट से बड़ा है ... इसलिए कोई अतिप्रवाह समस्या –

+0

हस्ताक्षरित लघु के लिए उदाहरण ... 32767 + 1 जेएस में 32768 है, अन्य भाषाओं में यह -32768 –

+0

@ जारोमांडाएक्स है ... क्या यह होना चाहिए - (2^53 + 1) '? मुझे नहीं पता ... बस केवल उत्सुक है। – rnevius

उत्तर

8

मान लीजिए कि आपके पास 8 बिट हस्ताक्षरित नंबर था।

1: 00000001

2: 00000010

15: 00001111

255: 11111111

यहाँ डिजिटल और बाइनरी अभ्यावेदन की एक चयन कर रहे हैं यदि आपके पास 255 है और 1 जोड़ें, तो क्या होता है? कोई अधिक बिट है, तो यह

0 के इर्द-गिर्द घूमती: 00000000

यहाँ uint का उपयोग कर सी # में एक प्रदर्शन (एक अहस्ताक्षरित 32-बिट पूर्णांक)

using System; 

public class Program 
{ 
    public static void Main() 
    { 
     uint n = 4294967294; 
     for(int i = 0; i < 4; ++i) 
     { 
      n = n + 1; 
      Console.WriteLine("n = {0}", n); 
     } 

    } 
} 

हो जाएगा ताकि उत्पादन है :

n = 4294967294 
n = 4294967295 
n = 0 
n = 1 

यह समस्या है जो आपको जावास्क्रिप्ट में नहीं मिलता है।


आपको विभिन्न समस्याएं मिलती हैं।

उदाहरण के लिए:

var n = 9007199254740991; 
 
var m = n + 1; 
 
var p = m + 1; 
 
alert('n = ' + n + ' and m = ' + m + ' and p = ' + p);

आप देखेंगे:

एन = 9007199254740991 और मीटर = 9007199254740992 और पी = 9007199254740992

बजाय wrappin जी चारों ओर, आपके नंबर के प्रतिनिधित्व सटीकता बहाल करेंगे।


ध्यान दें कि यह 'बहा सटीकता के व्यवहार जावास्क्रिप्ट लिए अद्वितीय नहीं है, यह क्या आप फ्लोटिंग प्वाइंट डेटा प्रकार से उम्मीद है। एक और नेट उदाहरण:

using System; 

public class Program 
{ 
    public static void Main() 
    { 
     float n = 16777214; // 2^24 - 2 
     for(int i = 0; i < 4; ++i) 
     { 
      Console.WriteLine(string.Format("n = {0}", n.ToString("0"))); 
      Console.WriteLine("(n+1) - n = {0}", (n+1)-n); 
      n = n + 1;     
     } 
    } 
} 

हो जाएगा ताकि उत्पादन:

जे एस में
n = 16777210 
(n+1) - n = 1 
n = 16777220 
(n+1) - n = 1 
n = 16777220 
(n+1) - n = 0 
n = 16777220 
(n+1) - n = 0 
संबंधित मुद्दे