C#, অনেক স্ট্যাটিকালি টাইপড ভাষার মতোই, এমন কিছু টাইপ দেয় যা ইন্টিজার প্রকাশ করে, যার প্রত্যেকটির নিজস্ব মানের পরিসীমা থাকে। একেবারে নিচের দিকে, sbyte টাইপের সর্বনিম্ন মান -128 আর সর্বোচ্চ মান 127। সব ইন্টিজার টাইপের মতোই এই মানগুলো <type>.MinValue এবং <type>.MaxValue হিসেবে পাওয়া যায়। একেবারে উপরের দিকে, long টাইপের সর্বনিম্ন মান -9,223,372,036,854,775,808 আর সর্বোচ্চ মান 9,223,372,036,854,775,807। এর মাঝখানে আছে short ও int টাইপ।
উপরের প্রতিটি টাইপের সাথে একটি করে আনসাইনড সমতুল্য টাইপ জোড়া লাগানো আছে: sbyte/byte, short/ushort, int/uint এবং long/ulong। সব ক্ষেত্রেই মানের পরিসীমা 0 থেকে শুরু করে ঋণাত্মক সাইনড সর্বোচ্চ মানের দ্বিগুণ যোগ 1 পর্যন্ত।
আনসাইনড ইন্টিগ্রাল টাইপের মানগুলো সাধারণ বেস 2 রূপে প্রকাশ করা হয়। সাইনড টাইপের মানগুলো দুইয়ের পরিপূরক সাইনড সংখ্যা রূপ ব্যবহার করে।
ইন্টিজার টাইপের এই বহুত্ব আসলে মেশিন আর্কিটেকচারের প্রতিচ্ছবি: রেজিস্টারের আকার, CPU ইনস্ট্রাকশনের আর্গুমেন্টের আকার আর CPU-এর ভেতরে সাইন কীভাবে দেখা হয়, এসবের প্রতিফলন। long টাইপের একটি মান 64 বিট ব্যবহার করে, অন্যদিকে sbyte টাইপের একটি মান ব্যবহার করে 8 বিট। কিছু ক্ষেত্রে এর প্রভাব পড়তে পারে CPU পারফরম্যান্স, মেমোরি ব্যবহার এমনকি ডিস্ক ব্যবহারেও (যেখানে ছোট ইন্টিজার টাইপ বেছে নেওয়া সাধারণত বেশি সুবিধাজনক)। ইন্টিজার type বাছাই করা অন্য ডেভেলপারদের কাছে প্রত্যাশিত মানের পরিসীমা জানানোর একটি মোটামুটি উপায়ও হতে পারে। কোনো নির্দিষ্ট ব্যবহার সম্পর্কে বিশেষ কিছু জানা না থাকলে int টাইপই সাধারণত ডিফল্ট টাইপ হিসেবে ব্যাপকভাবে ব্যবহৃত হয়। সাধারণ আইডেন্টিফায়ার হিসেবে long বা ulong ব্যাপকভাবে ব্যবহৃত হয়। টাইপের আকার (বাইটে) মানের পরিসীমা নির্ধারণ করে।
এখন পর্যন্ত আলোচনা করা টাইপগুলো প্রিমিটিভ টাইপ। প্রত্যেকটির সাথে একটি struct অ্যালিয়াস জোড়া লাগানো আছে, যেটি ওই টাইপের সাথে সম্পর্কিত ফিল্ড (যেমন MinValue) আর মেথড (যেমন ToString()) বাস্তবায়ন করে।
| টাইপ | স্ট্রাকট | প্রস্থ | সর্বনিম্ন | সর্বোচ্চ |
|---|---|---|---|---|
sbyte |
SByte |
8 বিট | -128 | +127 |
short |
Int16 |
16 বিট | -32_768 | +32_767 |
int |
Int32 |
32 বিট | -2_147_483_648 | +2_147_483_647 |
long |
Int64 |
64 বিট | -9_223_372_036_854_775_808 | +9_223_372_036_854_775_807 |
byte |
Byte |
8 বিট | 0 | +255 |
ushort |
UInt16 |
16 বিট | 0 | +65_535 |
uint |
UInt32 |
32 বিট | 0 | +4_294_967_295 |
ulong |
UInt64 |
64 বিট | 0 | +18_446_744_073_709_551_615 |
এক টাইপের একটি ভ্যারিয়েবল (বা এক্সপ্রেশন) সহজেই অন্য টাইপে রূপান্তর করা যায়। যেমন, একটি অ্যাসাইনমেন্ট অপারেশনে, যদি যে মানটি অ্যাসাইন করা হচ্ছে তার টাইপ (rhs) নিশ্চিত করে যে মানটি যেই টাইপে অ্যাসাইন করা হচ্ছে তার (lhs) পরিসীমার ভেতরে থাকবে, তাহলে সেটি একটি সাধারণ অ্যাসাইনমেন্ট:
ulong ul;
uint ui = uint.MaxValue;
ul = ui; // no problem
অন্যদিকে, যদি যে টাইপ থেকে অ্যাসাইন করা হচ্ছে তার পরিসীমা, যেই টাইপে অ্যাসাইন করা হচ্ছে তার মানের পরিসীমার উপসেট না হয়, তাহলে একটি কাস্ট, অর্থাৎ () অপারেশন দরকার হয়, এমনকি নির্দিষ্ট মানটি ওই টাইপের পরিসীমার ভেতরে থাকলেও:
uint ui;
short s = 42;
ui = (uint)s;
উপরের উদাহরণে, যদি মানটি বদলে গন্তব্য টাইপের পরিসীমার বাইরে পড়ত, তাহলে একটি ওভারফ্লো ঘটত। দেখুন overflow।
কাস্ট করার প্রয়োজনীয়তা নির্ধারিত হয় জড়িত দুটি টাইপ দিয়ে, কোনো নির্দিষ্ট মান দিয়ে নয়।
নিচের অনুচ্ছেদগুলোতে ইন্টিগ্রাল টাইপের কাস্ট নিয়ে আলোচনা করা হয়েছে। (দেখুন casting) কাস্টিং আর টাইপ কনভার্সন নিয়ে আরও বিস্তৃত আলোচনা দেয়। ইন্টিগ্রাল টাইপ আর ফ্লোটিং-পয়েন্ট সংখ্যা, char ও bool-এর মধ্যে রূপান্তর নিয়ে আলোচনার জন্য ওই ডকুমেন্টেশন দেখুন।
C#-এর টাইপ সিস্টেম C বা Javascript-এর চেয়ে কিছুটা কঠোর, আর তার ফলেই কাস্টিং অপারেশনগুলো বেশি সীমাবদ্ধ। ইমপ্লিসিট কাস্টিং দুটি সংখ্যাসূচক টাইপের মধ্যে ঘটে, যদি "to" টাইপটি "from" টাইপের মানের স্কেল আর সাইন অক্ষুণ্ণ রাখতে পারে।
ইমপ্লিসিট কাস্ট বোঝাতে কোনো বিশেষ সিনট্যাক্স লাগে না।
যেখানে সংখ্যাসূচক টাইপগুলো ইমপ্লিসিটভাবে কাস্ট করা যায় না, সেখানে সাধারণত এক্সপ্লিসিট কাস্ট অপারেটর ব্যবহার করতে পারেন।
যেখানে কাস্ট করা মানটি "to" টাইপ দিয়ে প্রকাশ করা যায় না, কারণ সেটি যথেষ্ট চওড়া নয় বা সাইনের সংঘর্ষ আছে, সেখানে একটি ওভারফ্লো এক্সেপশন নিক্ষিপ্ত হতে পারে।
int largeInt = Int32.MaxValue;
int largeNegInt = Int32.MinValue;
ushort shortUnsignedInt = ushort.MaxValue;
// implicit cast
int from_ushort = shortUnsignedInt; // 65535
float from_int = largeInt; // -21474836E+09
// explicit cast
uint from_largeInt = (uint)largeInt; // 2147483647
uint from_neg = (uint) largeNegInt; // 2147483648 or OverflowException is thrown (if checked)
BitConverter ক্লাসটি ইন্টিজার টাইপকে বাইটের অ্যারেতে এবং বাইটের অ্যারে থেকে ইন্টিজার টাইপে রূপান্তর করার একটি সুবিধাজনক উপায় দেয়।