द्वारा गुणा करने के समान नहीं है, मैंने केआर अभ्यास 2.1 का प्रयास किया - सीधे गणना द्वारा long
चर की सीमा निर्धारित करें। क्योंकि बाएँ पारी अतिप्रवाह मुझे लगता हैजब बाएं शिफ्ट 2
#include <stdio.h>
#include <limits.h>
int main()
{
unsigned short long_bits = sizeof(long) * CHAR_BIT;
printf("LONG_MAX = %ld\n", (1L << (long_bits - 1)) - 1);
printf("LONG_MIN = %ld\n", (-1) * (1L << (long_bits - 1)));
printf("ULONG_MAX (1) = %lu\n", (1UL << long_bits) - 1); // doesn't work
printf("ULONG_MAX (2) = %lu\n", 2*(1UL << (long_bits - 1)) - 1); // work
printf("\n");
}
ULONG_MAX (1) = 0
गलत है।ULONG_MAX (2) = 18446744073709551615
तो ऐसा लगता है कि बाईं पारी ऑपरेटर अतिप्रवाह से ग्रस्त द्वारा 2.
एक गुणा के साथ पिछले बाईं पारी की जगह सही लगता है, लेकिन गुणा नहीं करता है? क्या यह मध्यवर्ती गणना 2*(1UL << (long_bits - 1))
को long
से कुछ प्रकार के लिए प्रचारित करती है? मेरी मशीन में, long
और long long
बिल्कुल वही हैं (8 बाइट्स)।
संपादित करें: लुंडिन के रूप में बताया, सभी ULONG_MAX
के लिए आवश्यक printf("ULONG_MAX = %lu\n", ~0L);
इस मामले में बाईं पारी का प्रयोग की वजह से यूबी, और 2 से गुणा संभावित यूबी भी है (हालांकि मामला 2 दिखता का परिणाम सही बात)।
अंगूठे के नियम के रूप में: अंकगणित (संभावित) अतिप्रवाह से हस्ताक्षर किए गए अंकगणित; हस्ताक्षरित अंकगणित * * ओवरफ्लो नहीं कर सकता (क्योंकि मॉड्यूल 2^एन प्रदर्शन किया गया था)। – Jens
केस 2 सही नहीं है ... मामले के लिए ओवरफ्लो के कारण 1 – LPs
@ एलपी - केस 2 का आउटपुट हालांकि सही लगता है। यह मेरा सवाल है, इस मामले में ओवरफ्लो ऐसा नहीं लगता है – artm