1. টাইপকাস্টিং

জাভাতে টাইপকাস্টিং

আদিম প্রকারের ভেরিয়েবলগুলি (টাইপ বাদে boolean) বিভিন্ন ধরণের সংখ্যা সংরক্ষণ করতে ব্যবহৃত হয়। যদিও ভেরিয়েবলের প্রকারগুলি কখনই পরিবর্তিত হয় না, এমন একটি জায়গা রয়েছে যেখানে আপনি এক প্রকার থেকে অন্য প্রকারে রূপান্তর করতে পারেন। আর সেই জায়গাটা অ্যাসাইনমেন্ট

বিভিন্ন ধরনের ভেরিয়েবল একে অপরকে বরাদ্দ করা যেতে পারে। যখন আপনি এটি করেন তখন এক প্রকারের একটি ভেরিয়েবলের মান অন্য ধরণের একটি মানতে রূপান্তরিত হয় এবং দ্বিতীয় ভেরিয়েবলের জন্য নির্ধারিত হয়। এই বিষয়ে, আমরা দুটি ধরণের রূপান্তর সনাক্ত করতে পারি: প্রশস্ত করা এবং সংকীর্ণ করা।

প্রশস্তকরণ একটি ছোট ঝুড়ি থেকে একটি বড় ঝুড়িতে একটি মান স্থানান্তরিত করার মতো: এই অপারেশনটি নির্বিঘ্ন এবং ব্যথাহীন। যখন আপনি একটি বড় ঝুড়ি থেকে একটি ছোট ঝুড়িতে একটি মান স্থানান্তর করেন তখন সংকুচিত হয় : সেখানে পর্যাপ্ত স্থান নাও থাকতে পারে এবং আপনাকে কিছু ফেলে দিতে হবে।

এখানে ঘুড়ির আকার অনুসারে বাছাই করা প্রকারগুলি রয়েছে:

জাভা 2 এ টাইপকাস্টিং


2. প্রসারিত প্রকার রূপান্তর

এটি একটি সংখ্যাসূচক ধরনের একটি ভেরিয়েবল অন্য সংখ্যাসূচক ধরনের একটি পরিবর্তনশীল বরাদ্দ করা প্রায়ই প্রয়োজন. তুমি এটা কিভাবে করলে?

জাভা 4 পূর্ণসংখ্যার ধরন আছে:

টাইপ আকার
byte 1 byte
short 2 bytes
int 4 bytes
long 8 bytes

ছোট ঝুড়িতে সংরক্ষিত ভেরিয়েবল সবসময় বড় ঝুড়িতে সংরক্ষিত ভেরিয়েবলের জন্য বরাদ্দ করা যেতে পারে।

int, shortএবং byteভেরিয়েবল সহজে ভেরিয়েবলে বরাদ্দ করা যেতে পারে longshortএবং byteভেরিয়েবলগুলি ভেরিয়েবলগুলিতে বরাদ্দ করা যেতে পারে int। এবং ভেরিয়েবলের byteজন্য ভেরিয়েবল বরাদ্দ করা যেতে পারে short

উদাহরণ:

কোড বর্ণনা
byte a = 5;
short b = a;
int c = a + b;
long d = c * c;
এই কোড ঠিক ঠিক কম্পাইল হবে.

এই ধরনের একটি রূপান্তর, একটি ছোট থেকে একটি বড় ধরনের, একটি প্রশস্ত টাইপ রূপান্তর বলা হয়।

বাস্তব সংখ্যা সম্পর্কে কি?

তাদের সাথে, সবকিছু একই - আকার গুরুত্বপূর্ণ:

টাইপ আকার
float 4 bytes
double 8 bytes

floatdoubleকোনো সমস্যা ছাড়াই ভেরিয়েবলকে ভেরিয়েবল বরাদ্দ করা যেতে পারে । কিন্তু পূর্ণসংখ্যার ধরনগুলির সাথে জিনিসগুলি আরও আকর্ষণীয়।

আপনি একটি floatভেরিয়েবলের জন্য যেকোনো পূর্ণসংখ্যা ভেরিয়েবল বরাদ্দ করতে পারেন। এমনকি longটাইপ, যা 8 বাইট দীর্ঘ। এবং আপনি যা চান তা বরাদ্দ করতে পারেন - যেকোন পূর্ণসংখ্যা পরিবর্তনশীল বা floatপরিবর্তনশীল - একটি doubleপরিবর্তনশীলকে:

কোড বিঃদ্রঃ
long a = 1234567890;
float b = a;
double c = a;

b == 1.23456794E9
c == 1.23456789E9

মনে রাখবেন যে একটি বাস্তব প্রকারে রূপান্তর করার ফলে পর্যাপ্ত উল্লেখযোগ্য সংখ্যার অভাবের কারণে নির্ভুলতা হারাতে পারে।

পূর্ণসংখ্যা থেকে ফ্লোটিং-পয়েন্ট সংখ্যায় রূপান্তর করার সময়, সংখ্যার নিম্ন ক্রম অংশগুলি বাতিল করা হতে পারে। কিন্তু যেহেতু ভগ্নাংশ সংখ্যা আনুমানিক মান সঞ্চয় করার জন্য বোঝা যায়, তাই এই ধরনের অ্যাসাইনমেন্ট অপারেশন অনুমোদিত।


3. সংকীর্ণ টাইপ রূপান্তর

অন্যান্য সম্ভাবনা সম্পর্কে কি? যদি আপনি longএকটি intভেরিয়েবল একটি মান বরাদ্দ করতে হবে?

একটি ঝুড়ি হিসাবে একটি পরিবর্তনশীল কল্পনা করুন. আমাদের কাছে বিভিন্ন আকারের ঝুড়ি রয়েছে: 1, 2, 4 এবং 8 বাইট। একটি ছোট ঝুড়ি থেকে একটি বড় একটি আপেল স্থানান্তর করা একটি সমস্যা নয়. কিন্তু একটি বড় ঝুড়ি থেকে একটি ছোট ঝুড়িতে স্থানান্তর করার সময়, কিছু আপেল হারিয়ে যেতে পারে।

এই রূপান্তর — একটি বৃহত্তর টাইপ থেকে একটি ছোট টাইপ — একটি সংকীর্ণ টাইপ রূপান্তর বলা হয় । এইভাবে একটি অ্যাসাইনমেন্ট অপারেশন সম্পাদন করার সময়, একটি সংখ্যার অংশটি নতুন ভেরিয়েবলের সাথে খাপ খায় না এবং তাই বাতিল করা হতে পারে।

একটি টাইপ সংকুচিত করার সময়, আমাদের অবশ্যই কম্পাইলারকে স্পষ্টভাবে বলতে হবে যে আমরা ভুল করছি না, আমরা ইচ্ছাকৃতভাবে সংখ্যার অংশটি বাতিল করছি। এর জন্য টাইপকাস্ট অপারেটর ব্যবহার করা হয়। এটি বন্ধনীতে একটি টাইপ নাম ।

এই ধরনের পরিস্থিতিতে, জাভা কম্পাইলারের জন্য প্রোগ্রামারকে টাইপকাস্ট অপারেটর নির্দিষ্ট করতে হবে। সাধারণভাবে, এটি এই মত দেখায়:

(type) expression

উদাহরণ:

কোড বর্ণনা
long a = 1;
int b = (int) a;
short c = (short) b;
byte d = (byte) c;
প্রতিবার টাইপকাস্ট অপারেটরকে স্পষ্টভাবে নির্দেশ করতে হবে

এখানে aসমান 1, এবং সম্ভবত টাইপকাস্ট অপারেটরটি ওভারকিলের মতো মনে হচ্ছে। কিন্তু aবড় হলে কি হতো?

কোড বর্ণনা
long a = 1000000;
int b = (int) a;
short c = (short) b;
byte d = (byte) c;
a == 1000000
b == 1000000
c == 16960
d == 64

longএক মিলিয়ন একটি এবং একটি এর মধ্যে পুরোপুরি ফিট করে int। কিন্তু একটি shortভেরিয়েবলের জন্য 10 মিলিয়ন বরাদ্দ করার সময়, প্রথম দুটি বাইট বাতিল করা হয় এবং শুধুমাত্র শেষ দুটি বাইট রাখা হয়। এবং একটিকে বরাদ্দ করার সময় byte, শুধুমাত্র শেষ বাইটটি অবশিষ্ট থাকে।

সংখ্যাগুলি কীভাবে মেমরিতে সাজানো হয়:

টাইপ বাইনারি স্বরলিপি দশমিক স্বরলিপি
int 0বি 00000000 00001111 01000010 01000000 1000000
short 0b 01000010 01000000 16.960
byte 0b 01000000 64

charটাইপ

A char, a এর মতো short, দুটি বাইট দখল করে, কিন্তু একটিকে অন্যটিতে রূপান্তর করতে, আপনাকে সর্বদা একটি টাইপকাস্ট অপারেটর ব্যবহার করতে হবে। এখানে সমস্যাটি হল যে shortটাইপটি স্বাক্ষরিত এবং -32,768এটি থেকে থেকে মান ধারণ করতে পারে +32,767, তবে charটাইপটি স্বাক্ষরবিহীন এবং এটি থেকে 0পর্যন্ত মান থাকতে পারে 65,535

নেতিবাচক সংখ্যাগুলি একটিতে সংরক্ষণ করা যায় না char, তবে সেগুলি একটিতে সংরক্ষণ করা যেতে পারে short। এবং একটি shortএর চেয়ে বড় সংখ্যা সংরক্ষণ করতে পারে না 32,767, তবে এই জাতীয় সংখ্যাগুলি একটিতে সংরক্ষণ করা যেতে পারে char


4. একটি অভিব্যক্তির ধরন

যদি একই রাশিতে বিভিন্ন ধরনের ভেরিয়েবল ব্যবহার করা হয়? যৌক্তিকভাবে, আমরা বুঝতে পারি যে তাদের প্রথমে একটি সাধারণ প্রকারে রূপান্তর করতে হবে। কিন্তু কোনটি?

বৃহত্তর এক, অবশ্যই.

জাভা সবসময় বড় ধরনের রূপান্তর করে। মোটামুটিভাবে বলতে গেলে, একটি প্রকারকে প্রথমে প্রশস্ত করা হয় এবং শুধুমাত্র তারপরে একই ধরণের মান ব্যবহার করে অপারেশন করা হয়।

যদি একটি intএবং a longএকটি অভিব্যক্তিতে জড়িত থাকে, তবে এর মানটি inta এ রূপান্তরিত হবে longএবং শুধুমাত্র তখনই অপারেশনটি এগিয়ে যাবে:

কোড বর্ণনা
int a = 1;
long b = 2;
long c = a + b;
aa এ প্রশস্ত করা হবে longএবং তারপর সংযোজন ঘটবে।

ফ্লোটিং-পয়েন্ট সংখ্যা

যদি একটি পূর্ণসংখ্যা এবং একটি ফ্লোটিং-পয়েন্ট সংখ্যা ( floatবা double) একটি অভিব্যক্তিতে জড়িত থাকে, তাহলে পূর্ণসংখ্যাটি একটি ফ্লোটিং-পয়েন্ট সংখ্যা ( floatবা double) এ রূপান্তরিত হবে এবং শুধুমাত্র তখনই অপারেশন করা হবে।

যদি অপারেশনটি a floatএবং a জড়িত থাকে double, তাহলে floatএকটি তে রূপান্তরিত হবে double। যা আসলে প্রত্যাশিত।

আশ্চর্য

একে অপরের সাথে ইন্টারঅ্যাক্ট করার সময় byte, shortএবং প্রকারগুলি charসর্বদা রূপান্তরিত হয় । টাইপটিকে স্ট্যান্ডার্ড পূর্ণসংখ্যার ধরন হিসাবে বিবেচনা করার intএকটি ভাল কারণ রয়েছে ।int

আপনি a কে bytea দ্বারা গুণ করলে shortআপনি একটি পাবেন int। আপনি a কে bytea দ্বারা গুণ করলে byteআপনি একটি পাবেন int। এমনকি আপনি a byteএবং a যোগ করলেও byteআপনি একটি পাবেন int

এর বেশ কিছু কারণ রয়েছে। উদাহরণ:

কোড বর্ণনা
byte a = 110;
byte b = 120;
byte c = a * b;  // Error
110 * 120হল 13,200, যা প্রকারের সর্বোচ্চ মানের থেকে সামান্য বেশি byte:127
byte a = 110;
byte b = 120;
byte c = a + b; // Error
110 + 120হয় 230, যা প্রকারের সর্বোচ্চ মানের থেকেও সামান্য বেশি byte:127

সাধারণভাবে, একটি 8-বিট (1 বাইট) সংখ্যাকে 8-বিট (1 বাইট) সংখ্যা দ্বারা গুণ করার সময়, আমরা একটি সংখ্যা পাই যা 16-বিট বিট (2 বাইট) দখল করে।

ফলস্বরূপ, পূর্ণসংখ্যার ধরনগুলির থেকে ছোট সমস্ত ক্রিয়াকলাপগুলি intসর্বদা অবিলম্বে ints-এ রূপান্তরিত হয়। এবং এর মানে হল যে আপনি যদি একটি টাইপের থেকে ছোট একটি ভেরিয়েবলে গণনার ফলাফল সংরক্ষণ করতে চান int, তাহলে আপনাকে সর্বদা স্পষ্টভাবে টাইপকাস্ট অপারেটর নির্দিষ্ট করতে হবে।

উদাহরণ:

কোড বর্ণনা
byte a = 110;
byte b = 120;
byte c = (byte) (a * b);
অভিব্যক্তি byte * byteএকটি হবেint
byte a = 110;
byte b = 120;
byte c = (byte) (a + b);
অভিব্যক্তি byte + byteএকটি হবেint
byte a = 1;
byte b = (byte) (a + 1);
অভিব্যক্তিটি byte + intহবে একটি int
আক্ষরিক একটি একটি int

5. একটি গুরুত্বপূর্ণ nuance

টাইপকাস্ট অপারেটরের মোটামুটি উচ্চ অগ্রাধিকার রয়েছে।

এর মানে হল যে যদি একটি অভিব্যক্তিতে থাকে, উদাহরণস্বরূপ, যোগ এবং একটি টাইপকাস্ট অপারেটর, টাইপকাস্টটি যোগ করার আগে সঞ্চালিত হবে।

উদাহরণ:

কোড বর্ণনা
byte a = 1;
byte b = 2;
byte c = (byte) a * b;
টাইপকাস্ট অপারেটর শুধুমাত্র ভেরিয়েবলে প্রয়োগ করা হবে a, যা ইতিমধ্যেই একটি byte। এই কোড কম্পাইল হবে না.
byte a = 1;
byte b = 2;
byte c = (byte) (a * b);
এটাই সঠিক পথ।

আপনি যদি সম্পূর্ণ এক্সপ্রেশনটিকে একটি নির্দিষ্ট টাইপে রূপান্তর করতে চান, এবং শুধুমাত্র অভিব্যক্তির একটি উপাদান নয়, তাহলে সম্পূর্ণ অভিব্যক্তিটিকে বন্ধনীতে মুড়ে টাইপকাস্ট অপারেটরকে সামনে রাখুন।