সি-তে স্বাক্ষরিত রূপান্তরে স্বাক্ষরিত - এটি কি সর্বদা নিরাপদ?


135

ধরুন আমার কাছে নিম্নলিখিত সি কোড রয়েছে।

unsigned int u = 1234;
int i = -5678;

unsigned int result = u + i;

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

উত্তর:


223

সংক্ষিপ্ত উত্তর

তোমার iহবে রূপান্তরিত যোগ করে একটি স্বাক্ষরবিহীন পূর্ণসংখ্যা থেকে UINT_MAX + 1, তারপর উপরন্তু স্বাক্ষরবিহীন মান সম্পন্ন করা হবে, একটি বৃহৎ ফলে result(মান উপর নির্ভর করে uএবং i)।

দীর্ঘ উত্তর

সি 99 স্ট্যান্ডার্ড অনুসারে:

.3.৩.১.৮ সাধারণ গাণিতিক রূপান্তর

  1. উভয় অপারেন্ডে যদি একই ধরণের থাকে, তবে আর কোনও রূপান্তর প্রয়োজন হবে না।
  2. অন্যথায়, যদি উভয় অপারেন্ডে পূর্ণসংখ্যার স্বাক্ষরিত হয় বা উভয় স্বাক্ষরযুক্ত স্বাক্ষরিত পূর্ণসংখ্যার প্রকার থাকে তবে কম সংখ্যার রূপান্তর র‌্যাঙ্কের ধরণের অপারেন্ডটি আরও বেশি র‌্যাঙ্কযুক্ত অপারেন্ডের ধরণে রূপান্তরিত হয়।
  3. অন্যথায়, অপারেন্ডে, যা স্বাক্ষরবিহীন পূর্ণসংখ্যার ধরণের অপারেন্ডের অন্য অপারেন্ডের ধরণের বৃহত্তর বা সমান হয়, তবে স্বাক্ষরযুক্ত পূর্ণসংখ্যার ধরণের অপারেন্ডটি স্বাক্ষরযুক্ত পূর্ণসংখ্যার প্রকারের সাথে অপারেন্ডের ধরণে রূপান্তরিত হয়।
  4. অন্যথায়, যদি স্বাক্ষরিত পূর্ণসংখ্যার ধরণের অপারেন্ডের ধরণটি স্বাক্ষরযুক্ত পূর্ণসংখ্যার ধরণের সাথে অপারেন্ডের ধরণের সমস্ত মানকে উপস্থাপন করতে পারে তবে স্বাক্ষরযুক্ত পূর্ণসংখ্যার ধরণের অপারেন্ডটি স্বাক্ষরিত পূর্ণসংখ্যার প্রকারের সাথে অপারেন্ডের ধরণে রূপান্তরিত হয়।
  5. অন্যথায়, উভয় অপারেন্ড স্বাক্ষরিত পূর্ণসংখ্যার প্রকারের সাথে অপারেন্ডের ধরণের সাথে স্বাক্ষরযুক্ত স্বাক্ষর পূর্ণসংখ্যার ধরণে রূপান্তরিত হয়।

আপনার ক্ষেত্রে, আমাদের একটি স্বাক্ষরযুক্ত ( uএবং) স্বাক্ষরিত ( i) তে স্বাক্ষরিত । উপরের (3) উল্লেখ করে যেহেতু উভয় অপারেটের সমান র‌্যাঙ্ক রয়েছে তাই আপনার স্বাক্ষরবিহীন পূর্ণসংখ্যায় রূপান্তর করা iপ্রয়োজন ।

.3.৩.১.৩ স্বাক্ষরিত এবং স্বাক্ষরবিহীন পূর্ণসংখ্যাগুলি

  1. যখন পূর্ণসংখ্যার প্রকারের সাথে মানটি _বুল ব্যতীত অন্য কোনও পূর্ণসংখ্যার ধরণে রূপান্তরিত হয়, যদি মানটি নতুন ধরণের দ্বারা উপস্থাপন করা যায় তবে তা অপরিবর্তিত থাকে।
  2. অন্যথায়, যদি নতুন প্রকারটি স্বাক্ষরবিহীন থাকে, মানটি নতুন ধরণের সীমার মধ্যে না আসা পর্যন্ত নতুন ধরণের প্রতিনিধিত্বযোগ্য সর্বাধিক মানের চেয়ে আরও একবার যোগ বা বিয়োগ করে মানটিকে রূপান্তর করা হয়।
  3. অন্যথায়, নতুন ধরণের স্বাক্ষরিত এবং এতে মানটি উপস্থাপন করা যায় না; হয় ফলাফল বাস্তবায়ন সংজ্ঞায়িত হয় বা বাস্তবায়ন সংজ্ঞায়িত সংকেত উত্থাপিত হয়।

এখন আমাদের উপরে (2) উল্লেখ করতে হবে। আপনার iযোগ করে স্বাক্ষরবিহীন মানটিতে রূপান্তরিত হবে UINT_MAX + 1। সুতরাং ফলাফল কীভাবে UINT_MAXআপনার প্রয়োগের উপর সংজ্ঞায়িত হয় তার উপর নির্ভর করবে । এটি বড় হবে তবে এটি উপচে পড়বে না, কারণ:

.2.২.৫ (9)

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

বোনাস: গাণিতিক রূপান্তর আধা-ডাব্লুটিএফ

#include <stdio.h>

int main(void)
{
  unsigned int plus_one = 1;
  int minus_one = -1;

  if(plus_one < minus_one)
    printf("1 < -1");
  else
    printf("boring");

  return 0;
}

এটি অনলাইনে চেষ্টা করতে আপনি এই লিঙ্কটি ব্যবহার করতে পারেন: https://repl.it/repls/QuickW HimsicalBytes

বোনাস: পাটিগণিত রূপান্তর পার্শ্ব প্রতিক্রিয়া

গাণিতিক রূপান্তর নিয়ম UINT_MAXএকটি স্বাক্ষরযুক্ত স্বাক্ষরিত মানটি সূচনা করে এর মান পেতে ব্যবহার করা যেতে পারে -1, যেমন:

unsigned int umax = -1; // umax set to UINT_MAX

উপরে বর্ণিত রূপান্তর বিধিগুলির কারণে সিস্টেমের স্বাক্ষরিত সংখ্যার উপস্থাপনা নির্বিশেষে এটি বহনযোগ্য হিসাবে গ্যারান্টিযুক্ত। আরও তথ্যের জন্য এই SO প্রশ্নটি দেখুন: সমস্ত বিট সত্যে সেট করতে -1 ব্যবহার করা নিরাপদ?


আমি বুঝতে পারছি না কেন এটি কেবল নিরঙ্কুশ মান করতে পারে না এবং তারপরে ইতিবাচক সংখ্যার মতোই কেন স্বাক্ষরযুক্ত?
জোসে সালভাটিয়েরা

7
@ ডি.সিংহ আপনি দয়া করে উত্তরের মধ্যে ভুল অংশগুলি নির্দেশ করতে পারেন?
Shmil The Cat

স্বাক্ষরবিহীন স্বাক্ষরিত রূপান্তরিত করার জন্য, আমরা সই না হওয়া সর্বাধিক মান (UINT_MAX +1) যুক্ত করি। একইভাবে স্বাক্ষরযুক্ত থেকে স্বাক্ষরে রূপান্তর করার সহজ উপায় কী? আমাদের কি সর্বোচ্চ মান (স্বাক্ষরবিহীন চরের ক্ষেত্রে 256) থেকে প্রদত্ত সংখ্যাটি বিয়োগ করতে হবে? উদাহরণস্বরূপ: 140 যখন স্বাক্ষরিত সংখ্যায় রূপান্তরিত হয় -116 হয়। তবে 20 নিজেই 20 হয়ে যায়। এখানে কোন সহজ কৌশল?
জন হুইলক


24

স্বাক্ষরিত থেকে স্বাক্ষরিত রূপান্তর কেবল স্বাক্ষরিত মানটির প্রতিনিধিত্বের অনুলিপি বা পুনরায় ব্যাখ্যা করে না । সি স্ট্যান্ডার্ড (C99 6.3.1.3) উদ্ধৃত:

যখন পূর্ণসংখ্যার প্রকারের সাথে মানটি _বুল ব্যতীত অন্য কোনও পূর্ণসংখ্যার ধরণে রূপান্তরিত হয়, যদি মানটি নতুন ধরণের দ্বারা উপস্থাপন করা যায় তবে তা অপরিবর্তিত থাকে।

অন্যথায়, যদি নতুন প্রকারটি স্বাক্ষরবিহীন থাকে, মানটি নতুন ধরণের সীমার মধ্যে না আসা পর্যন্ত নতুন ধরণের প্রতিনিধিত্বযোগ্য সর্বাধিক মানের চেয়ে আরও একবার যোগ বা বিয়োগ করে মানটিকে রূপান্তর করা হয়।

অন্যথায়, নতুন ধরণের স্বাক্ষরিত এবং এতে মানটি উপস্থাপন করা যায় না; হয় ফলাফল বাস্তবায়ন সংজ্ঞায়িত হয় বা বাস্তবায়ন সংজ্ঞায়িত সংকেত উত্থাপিত হয়।

দু'জনের পরিপূরক প্রতিনিধিত্বের জন্য যা আজকাল প্রায় সর্বজনীন, বিটগুলি পুনরায় ব্যাখ্যা করার সাথে নিয়মগুলি মিলছে। তবে অন্যান্য উপস্থাপনার জন্য (সাইন-এন্ড-গ্রেগনিটিউশন বা একটির পরিপূরক), সি বাস্তবায়ন এখনও একই ফলাফলের ব্যবস্থা করতে হবে, যার অর্থ রূপান্তরটি কেবল বিটগুলি অনুলিপি করতে পারে না। উদাহরণস্বরূপ, (স্বাক্ষরবিহীন) -1 == UINT_MAX, উপস্থাপনা নির্বিশেষে।

সাধারণভাবে, সি রূপান্তরগুলি উপস্থাপনের জন্য নয়, মানগুলিতে পরিচালনা করতে সংজ্ঞায়িত হয়।

মূল প্রশ্নের উত্তর দিতে:

unsigned int u = 1234;
int i = -5678;

unsigned int result = u + i;

I এর মানটি স্বাক্ষরযুক্ত স্বাক্ষরে, রূপান্তরকারীতে রূপান্তরিত হয় UINT_MAX + 1 - 5678। এই মানটি তখন স্বাক্ষরিত স্বাক্ষরিত মান 1234 এ যোগ করা হয়, ফলন দেয় UINT_MAX + 1 - 4444

(স্বাক্ষরযুক্ত ওভারফ্লো থেকে পৃথক, স্বাক্ষরিত ওভারফ্লো অনির্ধারিত আচরণের জন্য আহ্বান জানায় rap


5

বাইবেল উল্লেখ :

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

3

যখন একটি স্বাক্ষরযুক্ত এবং একটি স্বাক্ষরযুক্ত ভেরিয়েবল যুক্ত করা হয় (বা কোনও বাইনারি অপারেশন) উভয়ই স্পষ্টতই স্বাক্ষরবিহীন স্বাক্ষরে রূপান্তরিত হয়, যা এক্ষেত্রে একটি বিশাল ফলাফল হতে পারে।

সুতরাং ফলাফলটি বিশাল এবং ভুল হতে পারে এই অর্থে এটি নিরাপদ তবে এটি কখনও ক্রাশ হবে না।


সত্য না. .3.৩.১.৮ সাধারণ গাণিতিক রূপান্তরগুলি যদি আপনি কোনও পূর্বে এবং একটি স্বাক্ষরবিহীন চরকে যোগ করেন তবে শেষেরটি ইনটে রুপান্তরিত হয়। আপনি যদি দু'টি স্বাক্ষরবিহীন চরটি যোগ করেন তবে সেগুলি ইনটে রূপান্তরিত হয়।
2501

3

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


1

আগে যেমন উত্তর দেওয়া হয়েছিল, আপনি কোনও সমস্যা ছাড়াই স্বাক্ষরিত এবং স্বাক্ষরিতদের মধ্যে পিছনে পিছনে পিছনে যেতে পারেন। স্বাক্ষরিত পূর্ণসংখ্যার জন্য সীমান্তের কেসটি -1 (0xFFFFFFFF)। এটি থেকে যোগ এবং বিয়োগের চেষ্টা করুন এবং আপনি দেখতে পাবেন যে আপনি পিছনে কাস্ট করতে পারেন এবং এটি সঠিক হতে পারে।

তবে, আপনি যদি পিছনে পিছনে কাস্টিং করতে যাচ্ছেন তবে আমি আপনার ভেরিয়েবলের নামকরণের জন্য দৃise়রূপে পরামর্শ দেব যাতে এটি স্পষ্ট হয় যে এটি কী ধরণের, উদাহরণস্বরূপ:

int iValue, iResult;
unsigned int uValue, uResult;

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


0

এখানে কী অন্তর্নিহিত রূপান্তর চলছে,

আমি স্বাক্ষরবিহীন পূর্ণসংখ্যায় রূপান্তরিত হব।

এবং এই কোডটি আপনার এবং i এর সমস্ত মানের জন্য নিরাপদ?

হ্যাঁ-সংজ্ঞায়িত হওয়ার অর্থে নিরাপদ ( https://stackoverflow.com/a/50632/5083516 দেখুন )।

নিয়মগুলি সাধারণভাবে স্ট্যান্ডার্ড-স্পিক পড়তে কঠোরভাবে লেখা থাকে তবে স্বাক্ষরিত পূর্ণসংখ্যায় স্বাক্ষরিত পূর্ণসংখ্যায় যে কোনও উপস্থাপনা ব্যবহৃত হত তাতে সংখ্যার 2 এর পরিপূরক প্রতিনিধিত্ব থাকবে।

সংযোজন, বিয়োগফল এবং গুণগুলি এই সংখ্যায় সঠিকভাবে কাজ করবে যার ফলস্বরূপ "সত্যিকারের ফলাফল" উপস্থাপনকারী দুটি দ্বিগুণ পরিপূরক সংখ্যা সহ আরও একটি স্বাক্ষরযুক্ত পূর্ণসংখ্যার ফলাফল হবে।

বৃহত্তর স্বাক্ষরযুক্ত পূর্ণসংখ্যার ধরণের বিভাগ এবং কাস্টিংয়ের সুস্পষ্ট সংজ্ঞাযুক্ত ফলাফল থাকবে তবে সেই ফলাফলগুলি "আসল ফলাফল" এর 2 টি পরিপূরক উপস্থাপনা হবে না।

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

স্বাক্ষরিত থেকে স্বাক্ষরিত রূপান্তরগুলি মান দ্বারা সংজ্ঞায়িত করা হয় বিপরীতে বাস্তবায়ন-সংজ্ঞায়িত উভয় জিসিসি এবং এমএসভিসি রূপান্তরকে সংজ্ঞায়িত করে যে আপনি স্বাক্ষরিত পূর্ণসংখ্যায় সঞ্চিত 2 এর পরিপূরক সংখ্যাকে স্বাক্ষরিত পূর্ণসংখ্যায় রূপান্তর করার সময় আপনি "আসল ফলাফল" পাবেন you । আমি আশা করি আপনি কেবল অস্পষ্ট সিস্টেমগুলিতে অন্য কোনও আচরণ খুঁজে পাবেন যা স্বাক্ষরিত পূর্ণসংখ্যার জন্য 2 এর পরিপূরক ব্যবহার করে না।

https://gcc.gnu.org/onlinesocs/gcc/Integers-implementation.html#Integers-implementation https://msdn.microsoft.com/en-us/library/0eex498h.aspx


-17

ভয়াবহ উত্তর গ্যালোর

ওজগুর ওসিতিটক

আপনি যখন স্বাক্ষরিত থেকে স্বাক্ষরিত (এবং তদ্বিপরীত) থেকে কাস্ট করেন তখন সংখ্যার অভ্যন্তরীণ উপস্থাপনা পরিবর্তন হয় না। কী পরিবর্তন হয় তা সংকলক কীভাবে সাইন বিটের ব্যাখ্যা করে।

এটি সম্পূর্ণ ভুল।

ম্যাটস ফ্রেড্রিকসন

যখন একটি স্বাক্ষরযুক্ত এবং একটি স্বাক্ষরযুক্ত ভেরিয়েবল যুক্ত করা হয় (বা কোনও বাইনারি অপারেশন) উভয়ই স্পষ্টতই স্বাক্ষরবিহীন স্বাক্ষরে রূপান্তরিত হয়, যা এক্ষেত্রে একটি বিশাল ফলাফল হতে পারে।

এটিও ভুল। স্বাক্ষরবিহীন টাইপগুলিতে প্যাডিং বিটের কারণে তাদের সমান যথাযথতা থাকাতে স্বাক্ষরিত ints ints এ প্রচার হতে পারে।

এসএমএইচ

আপনার সংযোজন ক্রিয়াকলাপটি ইন্টকে স্বাক্ষরবিহীন ইনটে রূপান্তরিত করে।

ভুল। হতে পারে এবং সম্ভবত এটি না।

স্বাক্ষরযুক্ত না থেকে স্বাক্ষরিত রূপান্তর রূপান্তর হ'ল বাস্তবায়ন নির্ভর। (তবে এটি সম্ভবত বেশিরভাগ প্ল্যাটফর্মগুলিতে আপনি যেভাবে প্রত্যাশা করেছিলেন সেভাবে কাজ করে))

ভুল। এটি হয় অপরিবর্তিত আচরণ যদি এটি অতিরিক্ত প্রবাহের কারণ হয় বা মান সংরক্ষণ করা হয়।

নামবিহীন

আমার মান স্বাক্ষরবিহীন ইনটে রূপান্তরিত ...

ভুল। স্বাক্ষরবিহীন ইন্টের সাথে সম্পর্কিত কোনও পূর্বের নির্ভুলতার উপর নির্ভর করে।

টেলর দাম

আগে যেমন উত্তর দেওয়া হয়েছিল, আপনি কোনও সমস্যা ছাড়াই স্বাক্ষরিত এবং স্বাক্ষরিতদের মধ্যে পিছনে পিছনে পিছনে যেতে পারেন।

ভুল। একটি স্বাক্ষরিত পূর্ণসংখ্যার পরিসরের বাইরে কোনও মান সঞ্চয় করার চেষ্টা করা হয় অপরিজ্ঞিত আচরণের ফলাফল।

এখন আমি শেষ পর্যন্ত প্রশ্নের উত্তর দিতে পারি।

যদি পূর্বের নির্ভুলতা স্বাক্ষরবিহীন int এর সমান হয় তবে আপনাকে একটি স্বাক্ষরিত ইনট হিসাবে উন্নীত করা হবে এবং আপনি অভিব্যক্তি (u + i) থেকে -4444 পাবেন। এখন, আপনার এবং আমার অন্যান্য মান হওয়া উচিত, আপনি উপচে পড়া এবং অপরিজ্ঞাত আচরণ পেতে পারেন তবে সেই সঠিক সংখ্যাগুলির সাথে আপনি পাবেন -4444 [1] । এই মান টাইপ int হবে। তবে আপনি সেই মানটি একটি স্বাক্ষরবিহীন ইনট হিসাবে সংরক্ষণ করার চেষ্টা করছেন যাতে তারপরে একটি স্বাক্ষরবিহীন অন্তর্ভুক্ত হয়ে যায় এবং ফলাফলটির ফলাফলটি শেষ হয়ে যায় (UINT_MAX + 1) - 4444।

স্বাক্ষরযুক্ত ইন্টিরিউশনটির নির্ভুলতা যদি কোন পূর্বের চেয়ে বেশি হয় তবে স্বাক্ষরিত মানটি একটি স্বাক্ষরিত মান হিসাবে উত্সাহিত হবে (UINT_MAX + 1) - 5678 যা অন্য স্বাক্ষরযুক্ত ইন্ট 1234-এ যুক্ত হবে আপনার এবং আমার উচিত অন্যান্য মানগুলি, যা {0..UINT_MAX range রেঞ্জের বাইরে প্রকাশ করে, মান (UINT_MAX + 1) হয় ফলাফল বা t 0..UINT_MAX সীমার মধ্যে না পড়ে অবধি বিয়োগ করা হবে এবং কোনও অপরিবর্তিত আচরণ ঘটবে না ।

নির্ভুলতা কি?

পূর্ণসংখ্যার প্যাডিং বিট, সাইন বিট এবং মান বিট রয়েছে। স্বাক্ষরবিহীন পূর্ণসংখ্যার স্পষ্টতই একটি চিহ্ন বিট নেই। স্বাক্ষরবিহীন চরটি প্যাডিং বিট না রাখার আরও গ্যারান্টিযুক্ত। একটি পূর্ণসংখ্যার মানের বিটের সংখ্যা হ'ল এটি কতটা নির্ভুল হয়।

[Gotchas]

প্যাডিং বিট উপস্থিত থাকলে কোনও পূর্ণসংখ্যার যথার্থতা নির্ধারণ করতে একা ম্যাক্রো ম্যাক্রো ব্যবহার করা যায় না। এবং বাইটের আকার C99 দ্বারা সংজ্ঞায়িত হিসাবে একটি অক্টেট (আট বিট) হতে হবে না।

[1] দুটি পয়েন্টের একটিতে ওভারফ্লো হতে পারে। হয় সংযোজনের আগে (প্রচারের সময়) - যখন আপনি স্বাক্ষরবিহীন কোনও int থাকে যা কোনও int এর ভিতরে ফিট করার পক্ষে খুব বড় large স্বাক্ষরবিহীন ইন্টটি কোনও প্রান্তের সীমার মধ্যে থাকলেও সংযোজনের পরেও ওভারফ্লো হতে পারে, সংযোজনের পরে ফলাফলটি এখনও প্রবাহিত হতে পারে।


6
"স্বাক্ষরবিহীন ints ints উন্নীত হতে পারে"। সত্য না. প্রকারগুলি ইতিমধ্যে র‌্যাঙ্ক> = ইন্টের মতো কোনও পূর্ণসংখ্যার প্রচার হয় না । .3.৩.১.১: "কোনও স্বাক্ষরযুক্ত পূর্ণসংখ্যার ধরণের রেঙ্কটি যদি স্বাক্ষরিত পূর্ণসংখ্যার সংখ্যার সমতুল্য হয়, যদি কোনও হয়।" এবং .3.৩.১.৮: "অন্যথায়, অপারেন্ডের স্বাক্ষরযুক্ত পূর্ণসংখ্যার ধরণের অপারেন্ড যদি অন্য অপারেন্ডের ধরণের চেয়ে বড় বা সমান হয়, তবে স্বাক্ষরযুক্ত পূর্ণসংখ্যার ধরণের অপারেন্ডটি স্বাক্ষরযুক্ত পূর্ণসংখ্যার সাথে অপারেন্ডের ধরণে রূপান্তরিত হয় Otherwise টাইপ করুন। " উভয় গ্যারান্টি যা সাধারণ গাণিতিক রূপান্তরগুলি প্রয়োগ intকরার unsigned intসময় রূপান্তরিত হয় ।
সিবি বেইলি

1
6.3.1.8 শুধুমাত্র পূর্ণসংখ্যার প্রচারের পরে ঘটে। অনুচ্ছেদটি খোলার মধ্যে বলা হয়েছে "অন্যথায়, উভয় অপারেন্ডে পূর্ণসংখ্যা প্রচার করা হয় TH তারপরে নিম্নলিখিত বিধিগুলি প্রচারিত অপারেশনগুলিতে প্রয়োগ করা হয়"। সুতরাং পদোন্নতির নিয়মগুলি .3.৩.১.১ পড়ুন ... "একটি পূর্ণসংখ্যার ধরণের একটি অবজেক্ট বা অভিব্যক্তি যার পূর্ণসংখ্যার রূপান্তর র‌্যাঙ্কটি ইক্যুয়াল এবং স্বাক্ষরবিহীন ইন্টের র‌্যাঙ্কের তুলনায় EQUAL এর চেয়ে কম বা" এবং কোন ইনট যদি সমস্ত মানটির প্রতিনিধিত্ব করতে পারে মূল টাইপ, মান একটি ইনট রূপান্তরিত হয় "।
এলিট এমএক্স

1
.3.৩.১.১ পূর্ণসংখ্যা প্রচার কিছু পূর্ণসংখ্যার ধরণের রূপান্তর করতে ব্যবহৃত হয় যা এমন নয় intবা unsigned intসেই ধরণের একটিতে যেখানে কিছু ধরণের unsigned intবা intপ্রত্যাশিত। "বা সমান" টিসি 2 এ যুক্ত করা হয়েছিল যাতে গণনা করা ধরণের রূপান্তর র‌্যাঙ্কের ধরণের সমান intবা unsigned intসেই ধরণের একটিতে রূপান্তরিত করা যায়। কখনই বর্ণিত পদোন্নতি unsigned intএবং এর মধ্যে রূপান্তরিত হবে এমনটি কখনই লক্ষ্য করা যায় নি int। মধ্যে সাধারণ ধরন সংকল্প unsigned intএবং intএখনও 6.3.1.8, এমনকি পোস্ট TC2 দ্বারা নিয়ন্ত্রিত হয়।
সিবি বেইলি

19
অন্যের ভুল উত্তরের সমালোচনা করার সময় ভুল উত্তর পোস্ট করা কাজ পাওয়ার পক্ষে একটি ভাল কৌশল বলে মনে হয় না ... ;-)
আর .. গিটিহাব বন্ধ করুন সহায়তা ICE

6
আমি মুছে ফেলার জন্য ভোট দিচ্ছি না কারণ অহংকারের সাথে মিলিত হওয়া এই স্তরের অন্যায়ের স্তরটি খুব
এমএম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.