C# Numeric Types: C# में निम्न सारणी अनुसार कुल 9 Integer Type के Value Types को Define किया गया है। जिनमें से char Value Type को मूल रूप से Characters को Represent करने के लिए Define किया गया है और इसके बारे में हम आगे जानेंगे। जबकि अन्य 8 Integer Data Types को Numeric Calculation के लिए ही Use किया जाता है।
Type | Width | Range | Suffix |
byte | 8-Bit | 0 to 255 | |
sbyte | 8-Bit | –128 to 127 | |
short | 16-Bit | –32,768 to 32,767 | |
ushort | 16-Bit | 0 to 65,535 | |
int | 32-Bit | –2,147,483,648 to 2,147,483,647 | |
uint | 32-Bit | 0 to 4,294,967,295 | U / u |
long | 64-Bit | –9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 | L / l |
ulong | 64-Bit | 0 to 18,446,744,073,709,551,615 | UL / ul |
जैसाकि उपरोक्त सारणी द्वारा हम समझ सकते हैं कि जब हमें किसी Variable में Signed संख्या को Store करना हो, तो हम संख्या की Range के अनुसार byte, short, int या long Keywords का प्रयोग करके Variable/Constant Declare करते हैं।
जबकि यदि हमें किसी Variable में जो Integer मान Store करना है, वह मान कभी भी Negative नहीं हो सकता हो, तो इस प्रकार के मानों को Store करने के लिए हमें मान की Range के आधार पर sbyte, ushort, uint या ulong Keywords का प्रयोग करके Variable/Constant Declare करना होता है।
उदाहरण के लिए हम सभी जानते हैं कि इन्सानों की उम्र की अधिकतम सीमा सामान्यत: 100–150 साल तक ही होती है। इसलिए उम्र को Computer में Store करने के लिए हम byte Data Type का प्रयोग कर सकते हैं, क्योंकि byte Type के Variable में अधिकतम Store की जा सकने वाली संख्या 255 है।
साथ ही किसी भी व्यक्ति की उम्र कभी भी Negative नहीं हो सकती] इसीलिए byte Data Type ही उम्र Store करने के लिए सबसे उपयुक्त Data Type है, क्योंकि byte Data Type के Variable में हम Negative मान Store नहीं कर सकते। यदि करने की कोशिश करते हैं, तो Compiler Error Generate करते हुए हमें ऐसा करने से रोकता है।
इस प्रकार से किसी Student की उम्र को Computer में Store करने के लिए हम निम्नानुसार Identifier Create कर सकते हैं:
byte age;
यदि हमें Computer में किसी Employee की Salary Store करनी हो, तो हम Salary Store करने के लिए निम्नानुसार short प्रकार का Variable Create कर सकते हैं-
short salary;
यदि किसी Company में Employees की Salary यदि 32767 तक हो, तो हम short Data Type का प्रयोग कर सकते हैं। लेकिन यदि किसी Company में Employees की Salary इससे अधिक हो, तो हम Salary Store करने के लिए निम्नानुसार int प्रकार का Variable Declare कर सकते हैं-
int salary;
कई बार हमें काफी बडी संख्याओं की गणना करने की जरूरत पडती है। उदाहरण के लिए यदि हमें किसी देश की कुल जनसंख्या को Computer में Store करना हो, तो हमें बहुत बडी संख्या को Store करने की जरूरत पडती है। इस जरूरत को byte, short या int प्रकार के Data Type द्वारा पूरा नहीं किया जा सकता।
इसलिए इस स्थिति में हमें long प्रकार का Variable Declare करना होता है। ये Data Type तब Use किया जाता है, जब बहुत बडे मान को Computer में Store करना होता है। इस Data Type का Variable हम निम्नानुसार Declare कर सकते हैं-
long population;
उपरोक्त सारणी में हमने uint, long, ulong Data Types के साथ Suffix को भी Specify किया है। इसलिए जब हम इन तीनों में से किसी प्रकार का Variable/Constant Declare करते हैं, तो इनमें मानों को Assign करते समय इनसे Associate Suffix को Value के साथ Specify करना जरूरी होता है।
उदाहरण के लिए यदि हम उपरोक्त Variable को कोई Value Assign करना चाहें, तो हमारा Assignment Statement कुछ निम्नानुसार होना चाहिए:
population = 1212121212121212F;
जैसाकि उपरोक्त Statement में हम देख सकते हैं कि हमने Value के साथ “L” Suffix Specify किया है। ये Suffix इसीलिए Specify किया है, ताकि Compiler को पता रहे कि हम एक Long Type के Variable को Value Assign कर रहे हैं।
.NET Platform int व long Type को मूल Data Type की तरह Treat करता है। इसलिए यदि Memory Efficiency ज्यादा महत्वपूर्ण न हो, तो Integer से सम्बंधित सभी जरूरी Variables को int या long Type का ही Declare करना चाहिए।
Integer Division Error
जब हम Integer Values के साथ प्रक्रिया करते हैं, तब Division Operation Perform करते समय Integer Value हमेंशा Truncate होती है। यानी यदि Division के बाद कोई दसमलव वाली संख्या Generate हो, तो Generate होने वाला दसमलव Part Compiler द्वारा Ignore कर दिया जाता है। जैसे:
// File Name: DivisionError.cs using System; namespace CSharpFundamentals { class DivisionError { private static void Main(string[] args) { int value1 = 2/3; int value2 = 5; int result = value2 / value1; Console.Write("Result: {0}", result); } } } // Output: Unhandled Exception: System.DivideByZeroException: Attempted to divide by zero. at CSharpFundamentals.DivisionError.Main(String[] args)
उपरोक्त Code में जब 2 में 3 का भाग दिया जाता है, तो Result के रूप में 0.666… मान Generate होता है, जो कि एक दसमलव वाली संख्या है। जबकि इस Expression से Generate होने वाले मान को निम्न Statement द्वारा एक Integer Type के Variable value1 में Store किया जा रहा है:
int value1 = 2/3;
परिणामस्वरूप C# Runtime इस Statement के Execute होने पर दसमलव के बाद की संख्या को Ignore करते हुए value1 में केवल 0 Store कर देता है। इसीलिए उपरोक्त Code में जब निम्न Statement Execute होता है:
int result = value2 / value1;
तो value2 Variable में Stored मान 5 में वास्तव में value1 में Stored मान 0 का भाग दिया जा रहा होता है, जो कि सम्भव नहीं है। इसीलिए उपरोक्त Program ठीक से Compile नहीं होता बल्कि Output में हमें एक Error प्राप्त होता है।
Integer Overflow Error
इसी तरह से जब हम किसी Integer Data Type के साथ किसी Arithmetic Operation को Perform करते हैं, तो Integer Type का Data Overflow भी हो सकता है। लेकिन जब Integer Overflow की स्थिति होती है, तो .NET Runtime हमें किसी तरह का कोई Error Display नहीं करताए बल्कि Overflow की स्थिति में Extra Bits को Compiler द्वारा Ignore कर दिया जाता है और ऐसा करने के बाद जो Binary बचती है, उस Binary से Generate होने वाली Value ही Variable में Stored रहती है। जैसे:
// File Name: IntegerOverflow.cs using System; namespace CSharpFundamentals { class IntegerOverflow { private static void Main(string[] args) { int value1 = int.MinValue; Console.WriteLine("Minimum Range of Integer: {0}", value1); int total = value1 - 1; Console.WriteLine("Maximum Range of Integer: {0}", total); } } } // Output: Minimum Range of Integer: -2147483648 Maximum Range of Integer: 2147483647
जैसाकि उपरोक्त उदाहरण में हम देख सकते हैं कि हमने value1 Variable को Integer की Minimum Range का मान Assign किया है, जिसे हम Output की First Line में देख सकते हैं। लेकिन जब हम इस Minimum Range में से 1 कम कर देते हैं, तो हमें Integer की Maximum Range प्राप्त हो जाती है।
ऐसा इसलिए होता है क्योंकि .NET Framework में int एक 32-Bit Data Type होता है, जिसमें कुल 31 Bits द्वारा Positive संख्या की Maximum Range प्राप्त होती है, जबकि Left-Most Bit से संख्या के Sign का पता चलता है।
यदि Left-Most Bit का मान 0 हो, तो संख्या Positive होती है, जबकि 1 होने पर संख्या Negative होती है। इस तरह से एक Integer द्वारा Store की जा सकने वाली Minimum Negative संख्या Memory में निम्नानुसार Store होती है:
10000000 00000000 00000000 0000000
परिणामस्वरूप जब Compiler उपरोक्त Program का निम्न Statement Execute करता है:
int value1 = int.MinValue;
तब value1 Variable में उपरोक्त Binary के रूप में संख्या -2147483648 Store हो जाती है। लेकिन जैसे ही हम इस संख्या में निम्न Statement के माध्यम से 1 घटाते हैं:
int total = value1 – 1;
value1 में Stored उपरोक्त Binary Change होकर निम्नानुसार हो जाती है:
01111111 11111111 11111111 11111111
जो कि Positive संख्या 2147483647 के बराबर मान को Represent करती है।
यानी जब हम किसी Integer Value में Store की जा सकने वाली Maximum Integer Value में कुछ जोडते हैं, तो Overflow की स्थिति बन जाती है। जबकि किसी Integer Value में Store की जा सकने वाली Minimum Integer Value में से कुछ घटाते हैं, तो Underflow की स्थिति बन जाती है और दोनों ही स्थितियों में हमें न तो हमें कोई Error प्राप्त होता है न ही सही Result प्राप्त होता है।
इसलिए इस प्रकार की स्थिति को Handle करने के लिए .NET Framework हमें checked नाम का एक Special Operator Provide करता है। इस Operator की विशेषता ये है कि जब भी कभी हम Integer Types के साथ ++, –, +, +, -, *, / या Manual Type Casting प्रक्रिया कर रहे होते हैं और Generate होने वाला Resultant मान अपनी Limit से बाहर जा रहा होता है, तो ये Operator एक OverflowException Generate करता है, जिससे हमें पता चल जाता है कि हमारा Integer Related Expression सही Result Generate नहीं कर रहा है तथा हमें Current Expression को Normally Handle करने के लिए और ज्यादा बडे Integer Data Type की जरूरत है।
checked Operator को हम हमारे उपरोक्त Program में ही निम्नानुसार तरीके से उपयोग में लेते हुए अपने Program को Modify कर सकते हैं, ताकि वह Program भी Integer Overflow की स्थिति में एक Exception Generate करे:
// File Name: checkedOperator4IntegerOverflow.cs using System; namespace CSharpFundamentals { class checkedOperator4IntegerOverflow { private static void Main(string[] args) { int value1 = int.MinValue; Console.WriteLine("Minimum Range of Integer: {0}", value1); int total = checked(value1 - 1); Console.WriteLine("Maximum Range of Integer: {0}", total); } } } // Output: Minimum Range of Integer: -2147483648 Unhandled Exception: System.OverflowException: Arithmetic operation resulted in an overflow. at CSharpFundamentals.checkedOperator4IntegerOverflow.Main(String[] args)
जैसाकि उपरोक्त Program में हम देख सकते हैं कि हमें जिस Integer Expression को Overflow की स्थिति के लिए Check करना होता है, उस Expression को हम checked() Method के बीच Specify करते हैं। परिणामस्वरूप इस बार जब ये Program Run होता है, तो हमें इस Program के Output के अनुसार एक Exception Error दिखाई देता है।
जब हमें एक से ज्यादा Integer Expressions को Overflow के लिए Check करना होता है, तब सभी Integer Expressions को Curly Braces के बीच Enclose करना पडता है। जैसे:
{ int value1 = int.MinValue; int total = checked(value1 - 1); }
checked Operator का प्रयोग हम float या double Types के साथ नहीं कर सकते। क्योंकि ये दोनों Overflow होने की स्थिति में Special “Infinite” Values Return करते हैं, जिसके बारे में हम आगे Discuss करेंगे।
ये Article इस वेबसाईट पर Selling हेतु उपलब्ध EBook C#.NET in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी।
C#.NET in Hindi | Page:908 | Format: PDF