केवल साइन बिट सेट वाले two's complement पूर्णांक को trap representation होना चाहिए
केवल साइन बिट वाला सबसे छोटा two's-complement integer मान (जैसे INT_MIN) यदि trap या NaN-जैसे sentinel के रूप में माना जाए, तो integer overflow और optional integers को संभालना अधिक सुरक्षित और आसान हो सकता है, लेकिन इससे मौजूदा code टूटेगा और hardware या compiler support चाहिए होगा। टिप्पणीकर्ता सममित ranges और built-in “missing” values के आकर्षण की तुलना performance, FFI interoperability, और दशकों पुराने उस software से करते हैं जो साधारण wrapping arithmetic मानकर चलता है। कई लोगों का मानना है कि core integer semantics को C, C++ और सामान्य ISAs में फिर से परिभाषित करने की बजाय बेहतर tooling (sanitizers, explicit bigints, या reserved “niche” values वाले नए integer types) अधिक उपयुक्त है.
प्रस्ताव और प्रेरणा
- चर्चा का केंद्र two's complement के “all-sign-bit” मान (जैसे, INT_MIN) को एक विशेष मामला बनाने पर है:
- या तो एक trap representation (इसे इस्तेमाल करने पर fault/exception हो)।
- या “missing”/अमान्य integers के लिए NaN‑जैसा sentinel।
- चर्चा में बताई गई प्रेरणाएँ:
- सममित integer ranges (−N..+N, बजाय −N−1..+N)।
- उस bit pattern का उपयोग करके सस्ते
optional<int>/ nullable-int representations। - C में
abs(INT_MIN)overflow जैसी corner cases को हटाना।
हार्डवेयर, प्रदर्शन, और कार्यान्वयन
- कई लोगों का तर्क है कि यह वास्तव में केवल hardware support के साथ ही समझ में आता है; हर operation के बाद software checks low-level भाषाओं के लिए बहुत महँगे माने जाते हैं।
- अन्य लोग इंगित करते हैं कि dynamic या high-level languages (Python, Lisp, Swift, R) पहले से ही समान लागतें वहन करती हैं (bignums, bounds checks, sentinels)।
- DSPs और कुछ ISAs वैकल्पिक arithmetic modes (saturating arithmetic, overflow flags) का समर्थन करते हैं, जिनका उपयोग किया जा सकता है।
सहीपन, UB, और भाषा semantics
- C/C++ signed overflow के undefined होने पर तीव्र बहस:
- कुछ लोग wrap (
-fwrapv) या traps (-ftrapv) को default बनाना चाहते हैं। - अन्य लोग ज़ोर देते हैं कि optimization के लिए UB पर निर्भरता ने वास्तविक security bugs और कठिन-से-debug व्यवहार पैदा किया है।
- कुछ लोग wrap (
- निम्न के बीच अंतर बताया गया:
- एक trap representation (C में उसे पढ़ना/लिखना ही UB है)।
- एक NaN‑जैसा value जिसकी propagation semantics परिभाषित हों।
- कई लोग नोट करते हैं कि इसे C में retrofit करने से मौजूदा, अभी-सही code और FFI expectations टूट जाएँगे।
विकल्प: Bignums, Saturation, Sentinels
- चर्चा किए गए विकल्प:
- डिफ़ॉल्ट रूप में arbitrary-precision integers (Lisp, Scheme, Python)।
- Range/interval types जहाँ out-of-range values “missing” को encode करें।
- Saturating arithmetic instructions या library ops।
- भाषा- या library-level niche types (non-zero, 63‑bit ints, Rust “niche” optimization, OCaml के tagged ints, R का NA integer)।
सुरक्षा बनाम उपलब्धता
- कुछ लोग overflow पर crash/trap को प्राथमिकता देते हैं ताकि silent data corruption से बचा जा सके।
- अन्य, विशेषकर safety- या mission-critical domains में, गलत values के बावजूद process death की बजाय operation जारी रखना पसंद करते हैं।
- निष्कर्ष: वांछनीय व्यवहार domain पर बहुत निर्भर है; एक single hardware या language default सभी use cases को संतुष्ट नहीं करेगा।