मेरे पास 16 बिट्स फ़ील्ड पर एक काउंटर है जो हार्डवेयर परिधीय समय के दौरान बढ़ाया/घट गया है।
मैं 32 बिट फ़ील्ड में अंतर को मापने के लिए समय-समय पर अपना मान नमूना देता हूं।काउंटर ओवरफ़्लो का पता लगाने/रोकने के लिए कैसे करें
मेरी समस्या अंतर की गणना करते समय 16 बिट्स फ़ील्ड के अतिप्रवाह/अंडरफ्लो का पता लगाना है।
के एक उदाहरण लेते हैं: नमूना n-1 पर
, काउंटर मूल्य वी.एन. -1 65530.
नमूना n के रूप में है, काउंटर मूल्य वी.एन. है 4.
काउंटर से 10 से वृद्धि की गई है लेकिन अंतर (वीएन - वीएन -1), 65529 की तरह कुछ होगा (सटीक मूल्य के बारे में सुनिश्चित नहीं है)।
इस ओवरफ़्लो का पता लगाने का एकमात्र तरीका अंतर वृद्धि मूल्य की तुलना में अधिकतम वृद्धि (मैं 10000 चुनता हूं) से अधिक निश्चित मूल्य की तुलना करना है।
क्या आप इस व्यक्तिपरक मूल्य की तुलना किए बिना इस अतिप्रवाह को प्रबंधित करने का समाधान जानते हैं?
static sint32 overallCount = 0;
sint32 diff;
static sint16 previousValue = 0;
sint16 currentValue;
currentValue = sampleValue();
diff = ((sint32) currentValue) - previousValue;
if(diff > 10000) {
diff -= 65536;
} else if ((-diff) > 10000) {
diff += 65536;
}
overallCount += diff;
क्या आप अपना बयान समझा सकते हैं? हस्ताक्षरित या हस्ताक्षरित में गणना करना केवल ओवरफ़्लो को 0/65535 से -32768/32768 पर स्थानांतरित कर देगा। – greydet
क्षमा करें, उम्मीद है कि यह अब बेहतर है। –
मैंने इस निहित प्रकार के रूपांतरण को हस्ताक्षरित हस्ताक्षर से कभी नहीं देखा! currentValue - पिछला वैल्यू हमेशा हस्ताक्षरित के रूप में किया जाएगा और वर्तमान के ओवरफ्लो के मामले में diff प्रभावी अंतर नहीं होगा – greydet