uint256 के अधिकतम मान को type(uint256).max; के साथ प्राप्त किया जा सकता है जो कि है:
115792089237316195423570985008687907853269984665640564039457584007913129639935
या 2²⁵⁶-1.
लेकिन type(uint256).max का उपयोग करना अधिक स्पष्ट और सुरक्षित है।
यही तरीका signed integer प्रकारों के लिए भी उपयोग किया जा सकता है:
//57896044618658097711785492504343953926634992332820282019728792003956564819967
type(int256).max;
//-57896044618658097711785492504343953926634992332820282019728792003956564819968
type(int256).min;
integers और unsigned integers में अधिकतम मान के पीछे का गणित
Unsigned integers के लिए, उत्तर प्राप्त करने के लिए बस अपनी पसंदीदा interpreted language के टर्मिनल में 2 ** n - 1 डालें, जहाँ n उस uint का आकार है, उदाहरण के लिए uint128 या uint32 (या यहाँ तक कि शायद ही कभी उपयोग किए जाने वाले लेकिन मान्य आकार जैसे uint208)। uintN का अर्थ है कि संख्या को दर्शाने के लिए N bits हैं, और जब उन सभी को 1 पर सेट किया जाता है, तो यह अधिकतम बाइनरी प्रतिनिधित्व होता है।
EVM signed संख्याओं को दर्शाने के लिए Twos Complement का उपयोग करता है, इसलिए एक signed integer का अधिकतम मान प्राप्त करने का सूत्र है और सबसे अधिक ऋणात्मक मान है।
uint256 अधिकतम मान प्राप्त करने के Hacky तरीके
आप इसे हेक्साडेसिमल के साथ भी निर्दिष्ट कर सकते हैं, जो दशमलव प्रतिनिधित्व का उपयोग करने की तुलना में थोड़ा स्पष्ट होगा, लेकिन फिर भी यह जगह घेरने वाला और त्रुटि-प्रवण (error prone) है।
hex में Uint256 अधिकतम मान
0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
यह ठीक 64 ‘f’ हैं, इसमें गलती न करें! 64 को 256 bits को 8 से विभाजित करके बाइट्स की संख्या (32) प्राप्त करने से निकाला गया है, और प्रत्येक अधिकतम बाइट को hex में 0xff द्वारा दर्शाया जाता है।
~uint256(0) uint256 अधिकतम मान के समतुल्य है
uint256 का अधिकतम मान 256 bits का सभी एक पर सेट होना है। तो क्यों न बिट फ्लिप ऑपरेटर का उपयोग किया जाए? (~)
type(uint256).max == ~uint256(0) // this will return true
एक और भद्दा समाधान integer को underflow करना है:
function maximum() public pure returns(uint256) {
unchecked { return uint256(0) - uint256(1); }
}
निम्नलिखित कोड ठीक से काम करता है, लेकिन यह भ्रामक है और उपयोग के लिए अनुशंसित नहीं है:
function maxUint() public pure returns (uint256) {
return 2**256 - 1;
}
यह सही मान लौटाता है, जिसे आप इसके साथ सत्यापित कर सकते हैं:
assert(2**256 - 1 == type(uint256).max);
यदि आप Solidity में 2**256 को एक constant के रूप में लिखते हैं, तो कोड compile नहीं होगा क्योंकि कंपाइलर पहचानता है कि 2**256 इतना बड़ा है कि uint256 में फिट नहीं हो सकता। लेकिन यदि इसके ठीक बाद “- 1” आता है, तो कंपाइलर यह पहचान लेता है कि अंकगणित का परिणाम प्रकार के साथ मान्य है।
uint256(-1) अब काम नहीं करता है
Solidity के पुराने संस्करणों में, अधिकतम मान प्राप्त करने के लिए uint256(-1) का उपयोग किया जा सकता था, लेकिन अब वह compile नहीं होगा।
बेहतर होगा कि इन सभी तिकड़मों से बचें और बस type(uint256).max का उपयोग करें।
2^256 - 1 आखिर कितना बड़ा है?
इस संख्या के संदर्भ को समझने के लिए, ज्ञात ब्रह्मांड में परमाणुओं की अनुमानित संख्या लगभग 10^80 है। इसकी कल्पना करने के लिए, आइए इन संख्याओं को अगल-बगल रखें:
115792089237316195423570985008687907853269984665640564039457584007913129639935
100000000000000000000000000000000000000000000000000000000000000000000000000000000
इसका मोटे तौर पर मतलब है कि 1,000 uint256 वेरिएबल्स ज्ञात ब्रह्मांड के हर एक परमाणु की गणना कर सकते हैं। चूंकि रुचि की अधिकांश “चीजें” 1,000 से कहीं अधिक परमाणुओं से बनी होती हैं, इसलिए एक अकेला uint256 चीजों के किसी भी उपयोगी सेट की आसानी से गणना कर सकता है और फिर भी काफी गुंजाइश बच जाएगी।
इसके परिणामस्वरूप, व्यावहारिक उद्देश्यों के लिए, बेतरतीब ढंग से चुने गए दो uint256 मानों (जो एक keccak256 हैश के आउटपुट के समतुल्य होते हैं) के बीच कभी भी टकराव (collision) नहीं होगा।
अधिक जानें
यदि आप Solidity में नए हैं, तो शुरुआती लोगों के लिए हमारा मुफ्त learn solidity free for beginner course देखें।
इंटरमीडिएट और उन्नत डेवलपर्स कृपया हमारे विशेषज्ञ solidity bootcamp को देखें।
मूल रूप से 2 अप्रैल, 2023 को प्रकाशित