c++ - पूर्णांक प्रकार int64_t इस कानूनी मूल्य को क्यों नहीं पकड़ सकता है?




c++11 numeric-limits (2)

मैं कुछ कोने के मामले के लिए एक परीक्षण मामला लिखने की कोशिश कर रहा हूं। int64_t के इनपुट के लिए, निम्नलिखित पंक्ति संकलित नहीं होगी:

int64_t a = -9223372036854775808LL;

त्रुटि / चेतावनी है:

error: integer constant is so large that it is unsigned [-Werror]

मुझे लगा कि संख्या सीमा से बाहर है, इसलिए मैंने कोशिश की:

std::cout << std::numeric_limits<int64_t>::min() << std::endl;

यह बिल्कुल उसी संख्या में आउटपुट करता है !!! तो निरंतर सीमा के भीतर है।

मैं इस त्रुटि को कैसे ठीक कर सकता हूं?


आप लिख सकते हैं

int64_t a = -1 - 9223372036854775807LL;

समस्या यह है कि - शाब्दिक का हिस्सा नहीं है, यह एक शून्य है। इसलिए संकलक पहले 9223372036854775808LL (हस्ताक्षर किए गए int64_t लिए सीमा से बाहर) को देखता है और फिर इस का नकारात्मक पता लगाता है।

बाइनरी माइनस लागू करके, हम दो शाब्दिक का उपयोग कर सकते हैं जो प्रत्येक श्रेणी में हैं।


बेन ने पहले से ही इसका कारण बताया, यहां दो अन्य संभावित उपाय बताए गए हैं।

इसे इस्तेमाल करे

int64_t a = INT64_MIN;

या यह

int64_t a = std::numeric_limits<int64_t>::min();




numeric-limits