সি ++ অপারেটরগুলিতে অন্তর্নিহিত ধরণের রূপান্তর নিয়ম


167

আমি কখন কাস্ট করা উচিত তা জানার বিষয়ে আরও ভাল হতে চাই। যোগ করার সময়, গুণিতকরণ ইত্যাদির সময় সি ++ এ অন্তর্নিহিত ধরণের রূপান্তর নিয়মগুলি কী কী? উদাহরণস্বরূপ,

int + float = ?
int * float = ?
float * int = ?
int / float = ?
float / int = ?
int / int = ?
int ^ float = ?

ইত্যাদি

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


15
মনে রাখবেন ^XOR।
GManNickG

15
@ আইট ^ ফ্লোট = সংকলন ত্রুটি :)
সার্জ ডুন্ডিচ

উত্তর:


223

সি ++ অপারেটরগুলিতে (পিওডি প্রকারের জন্য) সর্বদা একই ধরণের বস্তুগুলিতে কাজ করে।
সুতরাং তারা একই না হলে অন্যটির সাথে মিলিয়ে প্রচার করা হবে।
অপারেশনের ফলাফলের ধরণ অপারেঞ্জগুলির মতো (রূপান্তরের পরে)।

If either is      long          double the other is promoted to      long          double
If either is                    double the other is promoted to                    double
If either is                    float  the other is promoted to                    float
If either is long long unsigned int    the other is promoted to long long unsigned int
If either is long long          int    the other is promoted to long long          int
If either is long      unsigned int    the other is promoted to long      unsigned int
If either is long               int    the other is promoted to long               int
If either is           unsigned int    the other is promoted to           unsigned int
If either is                    int    the other is promoted to                    int
Both operands are promoted to int

বিঃদ্রঃ. অপারেশনগুলির সর্বনিম্ন আকার int। সুতরাং short/ অপারেশন সম্পন্ন হওয়ার আগে charপ্রচার করা intহয়।

আপনার সমস্ত অভিব্যক্তিতে অপারেশন সঞ্চালনের আগে intএকটিতে উন্নীত হয় float। অপারেশনের ফলাফল ক float

int + float =>  float + float = float
int * float =>  float * float = float
float * int =>  float * float = float
int / float =>  float / float = float
float / int =>  float / float = float
int / int                     = int
int ^ float =>  <compiler error>

1
"অপারেশনের সর্বনিম্ন আকার হ'ল আন্ত।" - এটি খুব আশ্চর্যজনক হবে (চার্চ / সংক্ষিপ্ত ক্রিয়াকলাপগুলি দক্ষতার সাথে সমর্থন করে এমন স্থাপত্যগুলির কী হবে?) এটি কি সত্যিই সি ++ অনুচ্ছেদে?
রাফা ডাউগার্ড

3
@ রাফাল: হ্যাঁ। কোন নির্দিষ্ট প্ল্যাটফর্মের অপারেশনের জন্য int সবচেয়ে কার্যকর পূর্ণসংখ্যার ধরণ বলে মনে করা হয়। চর অবশ্যই সর্বদা 1 হতে হবে তবে সংক্ষিপ্ত আকারের মতো একই আকার হতে পারে।
মার্টিন ইয়র্ক

1
@ রাফাł হ্যাঁ, এটি খুব আশ্চর্যজনক এবং এটি স্ট্যান্ডার্ডে রয়েছে। অনেক ক্ষেত্রে, আপনি যে আর্কিটেকচারটি বর্ণনা করেছেন এটি তার সুপার-দক্ষ charপ্রকারটি ব্যবহার করতে পারে । এর মান char + charযদি একটিতে নির্ধারিত হয় char, তবে এটি পাটিগণিতটি করতে পারে charএবং উদাহরণস্বরূপ চারপাশে মোড়ানো। তবে যদি ফলাফলটি নির্ধারিত হয় intতবে এর চেয়ে বেশি হলে সঠিক ফলাফল পেতে যথেষ্ট পরিমাণে পাটিগণিত করতে হবে CHAR_MAX
স্টিভ জেসোপ

2
আমি কেবল এই বিষয়টির উপর জোর দিতে চাই যে ইনটি স্বাক্ষরযুক্ত স্বাক্ষরিত হিসাবে উন্নীত হয় !!! আমি দিনের জন্য বাগ সঙ্গে লড়াই করে থাকেন, কারণ আমি ছাপ অধীন ছিল উভয় হবে উন্নীত int- এ দীর্ঘ যাতে একটি সম্ভাব্য নেতিবাচক ফলাফলের ঘটাবেন না একটি underflow / মোড়ানো-অ্যারাউন্ড বা।
নিটাস

10
সমস্যা উদাহরণ " int- এ স্বাক্ষরবিহীন int- এ উন্নীত পরার ": ((int) 4) - ((unsigned int) 5)পরিণাম ডেকে আনবে 429496729532 বিট ints এবং 32 বিট স্বাক্ষরবিহীন ints জন্য।
নিতাসাস

33

গাণিতিক অপারেশনগুলিতে floatফলাফল জড়িত float

int + float = float
int * float = float
float * int = float
int / float = float
float / int = float
int / int = int

আরও বিস্তারিত উত্তরের জন্য। সি ++ স্ট্যান্ডার্ডের §5 / 9 বিভাগটি কী দেখুন তা দেখুন

বহু বাইনারি অপারেটরগণ যারা গণিত বা গণনা প্রকারের অপারেশনগুলি প্রত্যাশা করেন একই ধরণের রূপান্তর ঘটায় এবং ফলস্বরূপ ফলাফলের ধরণ দেয়। উদ্দেশ্যটি হল একটি সাধারণ ধরণের ফলন, যা ফলাফলের ধরণও

এই প্যাটার্নটিকে সাধারণ গাণিতিক রূপান্তর বলা হয়, যা নিম্নলিখিত হিসাবে সংজ্ঞায়িত হয়:

- যদি অপরেন্দ্র টাইপ দীর্ঘ ডাবল হয় তবে অন্যটি লম্বা ডাবলে রূপান্তরিত হবে।

- অন্যথায়, যদি অপরেন্দ্র দ্বিগুণ হয় তবে অন্যটি ডাবল রূপান্তরিত হবে।

- অন্যথায়, যদি অপরেন্দ্রটি ভাসমান হয় তবে অন্যটি ফ্লোটে রূপান্তরিত হবে।

- অন্যথায়, অবিচ্ছেদ্য প্রচার (4.5) উভয় অপারেন্ডে করা হবে .5৪)

- তারপরে, উভয় অপ্রেন্ড স্বাক্ষরযুক্ত দীর্ঘ না হলে অন্যটি স্বাক্ষরযুক্ত লম্বায় রূপান্তরিত হবে।

- অন্যথায়, যদি একটি অপারেন্ডটি দীর্ঘ ইনট এবং অন্যটি স্বাক্ষরবিহীন অন্তর্ভুক্ত হয়, তবে যদি একটি দীর্ঘ অন্তর্নিহিত স্বাক্ষরবিহীন কোনও মানটির সমস্ত মান উপস্থাপন করতে পারে তবে স্বাক্ষরযুক্ত স্বাক্ষরকে একটি দীর্ঘ ইনটে রূপান্তর করা হবে; অন্যথায় উভয় অপারেন্ড স্বাক্ষরবিহীন দীর্ঘ অন্তর্নিহিত করা হবে।

- অন্যথায়, যদি অপরেন্ড দীর্ঘ হয়, অন্যটি দীর্ঘ রূপান্তরিত হবে।

- অন্যথায়, যদি অপারেন্ড স্বাক্ষরযুক্ত না হয়, অন্যটি স্বাক্ষরবিহীন রূপান্তরিত হবে।

[দ্রষ্টব্য: অন্যথায়, কেবলমাত্র অবশিষ্ট কেসটি হ'ল উভয় অপারেশনই পূর্বসূত্রে]


3
... এতক্ষণ হিসাবে অন্যান্য ধরনের তন্ন তন্ন doubleনা long double
সিবি বেইলি

1
@ চার্লস: সঠিক আরও স্পষ্ট করার জন্য আমি স্ট্যান্ডার্ড থেকে প্রাসঙ্গিক বিভাগটি উদ্ধৃত করেছি।
নওয়াজ

সুতরাং কোনও ডেটা ক্ষতি ছাড়াই কোনও পূর্ণসংখ্যাকে সবসময় ফ্লোটে রূপান্তর করা যায়? (উদাহরণস্বরূপ শূন্যটি আইএন দিয়ে এবং ম্যান্টিসার জন্য সমস্ত কিছু ব্যবহার করে)?
মার্কো এ

1
এই উত্তরটি পুরানো। আপডেটের পরামর্শ দিন। বিশেষত, long longএবং unsigned longঠিক এখানে সম্বোধন করা হয়নি।
chux - মনিকা 18

@MarcoA। একটি 32 বিট floatঅংশক যথেষ্ট বিট (24 বিট নেই আইইইই-754 একটি 32 বিট জন্য) int, তাই কিছু ডেটা হ্রাস হতে পারে। একটি 64-বিট doubleঠিক জরিমানা করা উচিত।
মার্ক র্যানসোম

17

যেহেতু অন্যান্য উত্তরগুলি এখানে C ++ 11 এর বিধি সম্পর্কে কথা বলে না। সি ++ 11 স্ট্যান্ডার্ড (খসড়া এন 3332) থেকে /5 / 9 (পার্থক্যের উপর জোর দেওয়া):

এই প্যাটার্নটিকে সাধারণ গাণিতিক রূপান্তর বলা হয় , যা নিম্নলিখিত হিসাবে সংজ্ঞায়িত হয়:

- যদি উভয় অপেন্ডেন্ড স্কোপযুক্ত গণনার ধরণের হয় তবে কোনও রূপান্তর সম্পাদিত হয় না; অন্য অপরেন্ডে যদি একই ধরণের না থাকে তবে অভিব্যক্তিটি অ-গঠিত।

- যদি অপরেন্দ্র টাইপ দীর্ঘ ডাবল হয় তবে অন্যটি লম্বা ডাবলে রূপান্তরিত হবে।

- অন্যথায়, যদি অপরেন্দ্র দ্বিগুণ হয় তবে অন্যটি ডাবল রূপান্তরিত হবে।

- অন্যথায়, যদি অপরেন্দ্রটি ভাসমান হয় তবে অন্যটি ফ্লোটে রূপান্তরিত হবে।

- অন্যথায়, অবিচ্ছেদ্য প্রচার উভয় অপারেন্ডে করা হবে। তারপরে নিম্নলিখিত বিধিগুলি প্রচারিত অপারেন্ডগুলির জন্য প্রয়োগ করা হবে:

- উভয় অপারেন্ডের যদি একই ধরণ থাকে তবে আর কোনও রূপান্তর প্রয়োজন হবে না।

- অন্যথায়, যদি উভয় অপারেন্ডে পূর্ণসংখ্যার স্বাক্ষরিত হয় বা উভয় স্বাক্ষরযুক্ত স্বাক্ষরযুক্ত পূর্ণসংখ্যার ধরণের থাকে তবে অপেক্ষাকৃত কম পূর্ণসংখ্যার রূপান্তর র‌্যাঙ্কের ধরণের অপারেন্ডকে বৃহত্তর র‌্যাঙ্কযুক্ত অপারেন্ডের ধরণে রূপান্তর করা হবে।

- অন্যথায়, অপারেন্ডে যে স্বাক্ষরবিহীন পূর্ণসংখ্যার ধরণের অপারেন্ড অন্য অপারেন্ডের ধরণের চেয়ে বড় বা সমান হয়, স্বাক্ষরযুক্ত পূর্ণসংখ্যার ধরণের অপারেন্ডটি স্বাক্ষরবিহীন পূর্ণসংখ্যার ধরণের সাথে অপারেন্ডের ধরণে রূপান্তরিত হবে।

- অন্যথায়, যদি স্বাক্ষরিত পূর্ণসংখ্যার ধরণের অপারেন্ডের ধরণটি স্বাক্ষরযুক্ত পূর্ণসংখ্যার ধরণের সাথে অপারেন্ডের ধরণের সমস্ত মানকে উপস্থাপন করতে পারে তবে স্বাক্ষরযুক্ত পূর্ণসংখ্যার ধরণের অপারেন্ডটি স্বাক্ষরিত পূর্ণসংখ্যার প্রকারের সাথে অপারেন্ডের ধরণে রূপান্তরিত হবে।

- অন্যথায়, উভয় অপারেন্ড স্বাক্ষরিত পূর্ণসংখ্যার ধরণের সাথে অপারেন্ডের ধরণের সাথে স্বাক্ষরযুক্ত স্বাক্ষর পূর্ণসংখ্যার ধরণে রূপান্তরিত হবে।

ঘন ঘন আপডেট হওয়া তালিকার জন্য এখানে দেখুন ।


1
এই নিয়মগুলি সি ++ এর সমস্ত সংস্করণে একই ছিল, স্কোপযুক্ত গণনাগুলি বাদে যা অবশ্যই C ++ 11 এ যুক্ত হয়েছিল
এমএম

6

এই উত্তরটি বেশিরভাগ অংশে @ রাফাডউগার্ডের দেওয়া মন্তব্যে পরিচালিত হয়েছে:

"অপারেশনের সর্বনিম্ন আকার হ'ল আন্ত।" - এটি খুব আশ্চর্যজনক হবে (চার্চ / সংক্ষিপ্ত ক্রিয়াকলাপগুলি দক্ষতার সাথে সমর্থন করে এমন স্থাপত্যগুলির কী হবে?) এটি কি সত্যিই সি ++ অনুচ্ছেদে?

মনে রাখবেন যে সি ++ স্ট্যান্ডার্ডটিতে সর্ব-গুরুত্বপূর্ণ "যেমন যদি" ​​বিধি থাকে। বিভাগ 1.8 দেখুন: প্রোগ্রাম কার্যকর:

৩) এই বিধানটিকে কখনও কখনও "বিস্ময়কর" বিধি বলা হয়, কারণ কোনও বাস্তবায়ন যতক্ষণ না মানদণ্ড থেকে নির্ধারণ করা যায় ততক্ষণ ফলস্বরূপ যে কোনও মান প্রয়োগ করা হয়েছে ততক্ষণ স্ট্যান্ডার্ডের যে কোনও প্রয়োজনীয়তা উপেক্ষা করা মুক্ত is প্রোগ্রাম আচরণ।

সংকলকটি intআকারে 8 বিট হিসাবে সেট করতে পারে না, যদিও এটি দ্রুততমও ছিল, যেহেতু মানকটি 16-বিট ন্যূনতম int

অতএব, সুপার-ফাস্ট 8-বিট ক্রিয়াকলাপ সহ একটি তাত্ত্বিক কম্পিউটারের ক্ষেত্রে গাণিতিকের intজন্য অন্তর্নিহিত পদোন্নতির বিষয়টি বিবেচনা করতে পারে। তবে, অনেকগুলি অপারেশনের জন্য, আপনি বলতে পারবেন না যে সংকলকটি প্রকৃতপক্ষে কোনওটির যথাযথভাবে কাজ করেছিল intএবং তারপরে charআপনার ভেরিয়েবলটিতে সংরক্ষণের জন্য একটিতে রূপান্তরিত হয়েছে , বা ক্রিয়াকলাপটি চরের সাথে সম্পন্ন হয়েছে কিনা।

উদাহরণস্বরূপ, বিবেচনা করুন unsigned char = unsigned char + unsigned char + unsigned char, যেখানে সংযোজন উপচে পড়বে (আসুন প্রতিটিটির জন্য 200 এর মান ধরে নেওয়া যাক)। আপনি যদি পদোন্নতি পান তবে আপনি int600 পাবেন, যা পরে স্পষ্টভাবে নীচে ফেলে দেওয়া unsigned charহবে যা মডিউল 256 মোড়ানো হবে, এইভাবে 88 এর চূড়ান্ত ফলাফল দেবে you যদি আপনি এই জাতীয় প্রচার না করেন তবে আপনাকে প্রথমটির মধ্যে আবদ্ধ করতে হবে দুই সংযোজন, যা থেকে সমস্যা কমে যাবে 200 + 200 + 200থেকে 144 + 200যা 88. করার হ্রাস অন্য কথায়, যা 344,, প্রোগ্রাম পার্থক্য জানতে না, তাই কম্পাইলার মধ্যে অন্তর্বর্তী কাজগুলি করতে হুকুম অগ্রাহ্য বিনামূল্যে intযদি operands আছে তুলনায় কম র‌্যাঙ্কিং int

এটি সংযোজন, বিয়োগফল এবং গুণনের সাধারণ ক্ষেত্রে সত্য। বিভাগ বা মডুলাসের ক্ষেত্রে এটি সাধারণভাবে সত্য নয়।


4

আপনি স্বাক্ষরবিহীন প্রকারগুলি বাদ দিলে একটি আদেশযুক্ত শ্রেণিবদ্ধতা রয়েছে: স্বাক্ষরিত চর, সংক্ষিপ্ত, দীর্ঘ, দীর্ঘ, দীর্ঘ দীর্ঘ, ভাসা, ডাবল, দীর্ঘ ডাবল। প্রথমত, উপরের ইনটির পূর্বে যে কোনও কিছু আসবে তা ইনটে রূপান্তরিত হবে। তারপরে, বাইনারি অপারেশনে নিম্ন র‌্যাঙ্কড প্রকারটি উচ্চে রূপান্তরিত হবে এবং ফলাফলগুলি উচ্চতর ধরণের হবে। (আপনি লক্ষ করবেন যে, শ্রেণিবিন্যাস থেকে যে কোনও সময় কোনও ভাসমান বিন্দু এবং একটি অবিচ্ছেদ্য প্রকার জড়িত থাকলে, অবিচ্ছেদ্য প্রকারটি ভাসমান বিন্দুতে রূপান্তরিত হবে))

স্বাক্ষরবিহীন জিনিসগুলি কিছুটা জটিল করে তোলে: এটি র‌্যাঙ্কিংটিকে ব্যাহত করে এবং র‌্যাঙ্কিংয়ের কিছু অংশ বাস্তবায়ন সংজ্ঞায়িত হয়। এ কারণে, একই অভিব্যক্তিতে স্বাক্ষরিত এবং স্বাক্ষরযুক্ত না মেশানো ভাল। (বেশিরভাগ সি ++ বিশেষজ্ঞরা বিটওয়াইজ অপারেশনগুলিতে জড়িত না হলে স্বাক্ষরবিহীন এড়ানোর বিষয়টি মনে করছেন That


3
স্ট্রাস্ট্রাপ তার পছন্দসইটি সুপারিশ করতে পারে, তবে intএমন সংখ্যার জন্য সাইন-সক্ষম ব্যবহার করা যা কখনও নেতিবাচক হওয়ার দরকার হয় না এটি উপলব্ধ পরিসীমাটির সম্পূর্ণ 50% এর সম্পূর্ণ অপচয় is আমি অবশ্যই স্ট্রস্ট্রপ না, তবে আমি unsignedডিফল্টরূপে এবং signedকেবল তখনই আমার কোনও কারণ থাকে।
আন্ডারস্কোর_১১

1
আপনাকে বিয়োগ করতে হবে এমন দিন অবধি আন্ডারস্কোর_ ডি, এটি বেশ ভাল। সি ++ এ স্বাক্ষরযুক্ত সংখ্যার সাথে প্রাথমিক সমস্যাটি হ'ল আপনি বিয়োগটি সম্পাদন করলে তারা স্বাক্ষরবিহীন থাকে। সুতরাং ধরুন আপনি একটি ফাংশন লিখে দেখুন যে কোনও স্টাড :: ভেক্টর ক্রমানুসারে রয়েছে কিনা। আপনি লিখতে পারে bool in_order(vector<T> vec) { for ( int i = 0; i < size() - 1; ++i) { if (vec[i + 1] < vec[i]) return false; } return true;এবং তারপর আপনি বিরক্ত করা চাই এটি দেখতে পেল তা ফাঁকা ভেক্টরের জন্য ক্র্যাশ কারণ আকার () - 1 রিটার্ন 18446744073709551615.
jorgbrown

3

আমার সমাধান করতে সমস্যা , WA (ভুল উত্তর), তারপর আমি এক পরিবর্তিত পেয়েছিলাম intকরার long long intএবং এটি দিয়েছে এসি (গ্রহণ) । পূর্বে, আমি চেষ্টা করছিলাম long long int += int * intএবং আমি এটি সংশোধন করার পরে long long int += long long int * int। গুগলিং আমি নিয়ে এসেছি,

1. গাণিতিক রূপান্তর

ধরণের রূপান্তরকরণের শর্তসমূহ:

শর্তগুলি মেট ---> রূপান্তর

  • হয় অপেরাড টাইপ দীর্ঘ ডাবল হয় । ---> অন্যান্য অপারেন্ড দীর্ঘ ডাবল টাইপ রূপান্তরিত হয় ।

  • পূর্ববর্তী শর্তটি পূরণ হয়নি এবং অপরেন্দ্র টাইপ দ্বিগুণ । ---> অন্যান্য অপারেন্ড ডাবল টাইপে রূপান্তরিত হয় ।

  • পূর্ববর্তী শর্তগুলি পূরণ করা হয়নি এবং উভয়ই অপেরাড টাইপ ফ্লোট । ---> অন্যান্য অপরেনড টাইপ ফ্লোটে রূপান্তরিত হয় ।

  • পূর্ববর্তী শর্তগুলি পূরণ করা হয়নি (কোনও অপারেশন ভাসমান ধরণের নয়)। ---> ইন্টিগ্রাল প্রচারগুলি নীচে অপারেন্ডগুলিতে সঞ্চালিত হয়:

    • যদি অপরেন্দ্র টাইপ স্বাক্ষরবিহীন দীর্ঘ হয় তবে অন্য অপারেন্ডটি স্বাক্ষরবিহীন দীর্ঘতে রূপান্তরিত হয়
    • যদি শর্ত পূর্ববর্তী পূরণ না, এবং যদি পারেন প্রতীক ধরনের হয় দীর্ঘ এবং ধরন অন্যান্য স্বাক্ষরবিহীন int- এ , উভয় operands টাইপ করতে রূপান্তরিত হয় দীর্ঘ স্বাক্ষরবিহীন
    • পূর্ববর্তী দুটি শর্ত পূরণ না হয়, আর যদি পারেন প্রতীক ধরনের হয় দীর্ঘ , টি সে প্রতীক টাইপ রূপান্তরিত হয় দীর্ঘ
    • যদি পূর্ববর্তী তিনটি শর্ত পূরণ না হয় এবং অপরেন্দ্র স্বাক্ষরবিহীন প্রকারের হয় তবে অন্য অপারেন্ডটি স্বাক্ষরবিহীন প্রকারে রূপান্তরিত হয়
    • যদি পূর্ববর্তী অবস্থার কেউ পূরণ করা, উভয় operands টাইপ করতে রূপান্তরিত হয় int- এ

ঘ। পূর্ণসংখ্যার রূপান্তর নিয়ম

  • পূর্ণসংখ্যা প্রচার:

ইন্টের চেয়ে ছোট পূর্ণসংখ্যার প্রকারগুলি যখন তাদের উপর কোনও অপারেশন করা হয় তখন প্রচার করা হয়। যদি মূল প্রকারের সমস্ত মানকে একটি int হিসাবে উপস্থাপন করা যায় তবে ছোট প্রকারের মানটি একটি int তে রূপান্তরিত হয়; অন্যথায়, এটি একটি স্বাক্ষরবিহীন int তে রূপান্তরিত হয়। পূর্ণসংখ্যার প্রচারগুলি নির্দিষ্ট যুক্তি প্রকাশের ক্ষেত্রে সাধারণ গাণিতিক রূপান্তরগুলির অংশ হিসাবে প্রয়োগ করা হয়; ইউনারি +, -, এবং ~ অপারেটরগুলির অপারেশনগুলি; এবং শিফট অপারেটরদের অপারেশনগুলি।

  • পূর্ণসংখ্যার রূপান্তর র‌্যাঙ্ক:

    • দু'টি স্বাক্ষরিত পূর্ণসংখ্যার ধরণের ক্ষেত্রে একই রকমের উপস্থিতি থাকবে না, এমনকি যদি তাদের প্রতিনিধিত্ব একই রকম হয়।
    • স্বাক্ষরিত পূর্ণসংখ্যার ধরণের র‌্যাঙ্ক কম নির্ভুলতার সাথে কোনও স্বাক্ষরিত পূর্ণসংখ্যার ধরণের চেয়ে বেশি হবে।
    • র‌্যাঙ্কটি এর পদমর্যাদার long long intচেয়ে বৃহত্তর হতে হবে long int, যা র‌্যাঙ্কের intচেয়ে বেশি হবে short int, যা র‌্যাঙ্কের চেয়ে বেশি হবে, যা পদমর্যাদার চেয়ে বড় হবেsigned char
    • যেকোন স্বাক্ষরযুক্ত পূর্ণসংখ্যার ধরণের রেঙ্কটি সংশ্লিষ্ট স্বাক্ষরিত পূর্ণসংখ্যার ধরণের সমান হবে, যদি থাকে তবে।
    • যে কোনও মানক পূর্ণসংখ্যার ধরণের রেঙ্ক একই প্রস্থের সাথে কোনও বর্ধিত পূর্ণসংখ্যার ধরণের চেয়ে বেশি হতে হবে।
    • পদে charপদে সমান হইবে signed charএবংunsigned char
    • একই স্পষ্টতা সহ অন্য বর্ধিত স্বাক্ষরিত পূর্ণসংখ্যার ধরণের সাথে সম্পর্কিত কোনও বর্ধিত স্বাক্ষরিত পূর্ণসংখ্যার ধরণের র‌্যাঙ্কটি বাস্তবায়ন-সংজ্ঞায়িত তবে এখনও পূর্ণসংখ্যার রূপান্তর র‌্যাঙ্ক নির্ধারণের জন্য অন্যান্য নিয়মের সাপেক্ষে।
    • সমস্ত পূর্ণসংখ্যার ধরণের জন্য টি 1, টি 2, এবং টি 3, যদি টি 1 টি টি 2 এর চেয়ে বেশি এবং টি 2 টি টি -3 এর চেয়ে বেশি হয় তবে টি 1 টি টি -3 এর চেয়ে বেশি র‌্যাঙ্ক পেয়ে থাকে।
  • সাধারণ গাণিতিক রূপান্তরসমূহ:

    • যদি উভয় অপারেন্ডের একই ধরণ থাকে তবে আর কোনও রূপান্তর প্রয়োজন হবে না।
    • যদি উভয় অপারেন্ড একই সংখ্যার ধরণের হয় (স্বাক্ষরিত বা স্বাক্ষরযুক্ত) না হয় তবে অপেক্ষাকৃত কম সংখ্যার রূপান্তর র‌্যাঙ্কের ধরণের অপারেন্ড আরও বেশি র‌্যাঙ্কযুক্ত অপারেন্ডের ধরণে রূপান্তরিত হয়।
    • অপারেন্ডে যে স্বাক্ষরযুক্ত পূর্ণসংখ্যার ধরণের অপারেন্ড অন্য অপারেন্ডের ধরণের চেয়ে বড় বা সমান হয়, স্বাক্ষরযুক্ত পূর্ণসংখ্যার ধরণের অপারেন্ডটি স্বাক্ষরযুক্ত পূর্ণসংখ্যার প্রকারের সাথে অপারেণ্ডের ধরণে রূপান্তরিত হয়।
    • স্বাক্ষরিত পূর্ণসংখ্যার ধরণের অপারেন্ডের ধরনটি স্বাক্ষরযুক্ত পূর্ণসংখ্যার ধরণের সাহায্যে অপারেন্ডের ধরণের সমস্ত মানের প্রতিনিধিত্ব করতে পারে, স্বাক্ষরযুক্ত পূর্ণসংখ্যার ধরণের অপারেন্ডটি স্বাক্ষরিত পূর্ণসংখ্যার প্রকারের সাথে অপারেন্ডের ধরণে রূপান্তরিত হয়।
    • অন্যথায়, উভয় অপারেন্ড স্বাক্ষরিত পূর্ণসংখ্যার প্রকারের সাথে অপারেন্ডের ধরণের সাথে স্বাক্ষরযুক্ত স্বাক্ষর পূর্ণসংখ্যার ধরণে রূপান্তরিত হয়। নির্দিষ্ট ক্রিয়াকলাপগুলি স্বাভাবিক গাণিতিক ক্রিয়াকলাপগুলির শব্দার্থকে যুক্ত বা সংশোধন করতে পারে।

1

পুরো অধ্যায় 4 রূপান্তর সম্পর্কে আলোচনা করে, তবে আমি মনে করি আপনার বেশিরভাগ ক্ষেত্রেই এই বিষয়ে আগ্রহী হওয়া উচিত:

৪.৪ ইন্টিগ্রাল পদোন্নতি [কনফার্ট প্রম]
টাইপ চর, স্বাক্ষরিত চর, স্বাক্ষরবিহীন চর, শর্ট ইনট বা স্বাক্ষরযুক্ত স্বল্প প্রান্তের একটি মূল্য যদি প্রকারের উত্সের সমস্ত মানকে উপস্থাপন করতে পারে তবে টাইপ ইন্টের মূল্যে রূপান্তরিত হতে পারে; অন্য
অনুসারে, উত্সের মূল্যকে স্বাক্ষরবিহীন প্রকারের আকারের মধ্যে রূপান্তর করা যেতে পারে।
টাইপ wchar_t (3.9.1) এর একটি মূল্য বা একটি গণনা টাইপ (7.2)
তার অন্তর্নিহিত প্রকারের সমস্ত মান উপস্থাপন করতে পারে যা নীচের প্রথম ধরণের একটি মূল্যায় রূপান্তরিত হতে পারে : int, স্বাক্ষরবিহীন int,
দীর্ঘ বা স্বাক্ষরবিহীন দীর্ঘ।
ইন্টিগ্রাল বিট-ফিল্ডের জন্য একটি মূল্য (9.6) ইনট
বিট-ফিল্ডের সমস্ত মান উপস্থাপন করতে পারে যদি টাইপ ইন্টের একটি মূল্যকে রূপান্তর করা যায় ; অন্যথায়, স্বাক্ষরবিহীন কোনটি পুনরায়-
বিট-ফিল্ডের সমস্ত মানকে অসন্তুষ্ট করুন। যদি বিট-ফিল্ডটি এখনও বড় হয়, তবে এর জন্য কোনও অবিচ্ছেদ্য প্রচার প্রযোজ্য নয়। যদি
বিট-ফিল্ডের একটি গণনা করা টাইপ রয়েছে, এটিকে প্রচারের উদ্দেশ্যে সেই ধরণের অন্য কোনও মান হিসাবে ধরা হয়।
মিথ্যা শূন্য হয়ে ও সত্য
হয়ে ওঠার সাথে টাইপ বুলের একটি মূল্যকে টাইপ ইন্টের মূল্যকে রূপান্তর করা যায় ।
এই রূপান্তরগুলিকে অবিচ্ছেদ্য প্রচার বলে।

৪.6 ফ্লোটিং পয়েন্ট প্রমোশন [কনফার্টফ্রেম]
প্রকারের ফ্লোটের একটি মূল্যকে ডাবল টাইপের মূল্যে রূপান্তর করা যায়। মান অপরিবর্তিত।
এই রূপান্তরটিকে ফ্লোটিং পয়েন্ট প্রচার বলে।

অতএব, ভাসমান জড়িত সমস্ত রূপান্তর - ফলাফলটি ভাসমান।

উভয় অন্তর্ভুক্ত জড়িত এক - ফলাফল int: int / int = int


1

উভয় অংশই একই ধরণের না হলে প্রকাশের ধরণটি উভয়ের মধ্যে বৃহত্তমতে রূপান্তরিত হবে । এখানে সমস্যাটি বুঝতে হবে যে কোনটি অন্যটির চেয়ে বড় (এটি বাইট আকারের সাথে কিছু করার নেই)।

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

অন্যান্য পার্থক্যটি ধরণের সামর্থ্যের সাথে সম্পর্কিত। উদাহরণস্বরূপ, কোনও ইন্টার এবং দীর্ঘ ইনট অন্তর্ভুক্ত একটি এক্সপ্রেশন দীর্ঘ টাইপ টাইপের ফলস্বরূপ।


2
এটি সত্য নয়। মে প্ল্যাটফর্মে একটি long"বড়" একটি চেয়ে floatকিন্তু ধরণ কি long+ + float?
সিবি বেইলি

1
-1: আপনি সবচেয়ে বড় মানে কি ? একটি ভাসা একটি int এর চেয়ে বড় ? নাকি তদ্বিপরীত ?
পল আর

2
আপনার মন্তব্যের জন্য আপনাকে ধন্যবাদ। হ্যাঁ, এখানে বাইট আকারে মোটেও আগ্রহ নেই। এটি যেমন প্রকাশ পেয়েছে, স্পষ্টতই এর তাত্ক্ষণিকতার মধ্যে সবচেয়ে বড় স্থাপন উত্তরটি ব্যাখ্যা করার জন্য যথেষ্ট নয়। যাইহোক, এটি আরও গভীরভাবে ব্যাখ্যা করা কোনও অর্থবোধ করে না, যেহেতু এখন অন্য অনেকগুলি, খুব গভীর উত্তর রয়েছে।
বাল্টাসার্ক

-2

সতর্কীকরণ!

রূপান্তরগুলি বাম থেকে ডানে ঘটে।

এটা চেষ্টা কর:

int i = 3, j = 2;
double k = 33;
cout << k * j / i << endl; // prints 22
cout << j / i * k << endl; // prints 0

8
এটি রূপান্তরতার কারণে নয় অপারেটর প্রাধান্যের কারণে। j + i * k101 এর ফলাফল হবে
গার্টেনরিজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.