সি এবং সি ++ এ স্বাক্ষরবিহীন পূর্ণসংখ্যার ব্যবহার


23

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

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

একই সাথে বিভিন্ন কোডিং গাইড আমি পড়ছি (উদাঃ গুগল) স্বাক্ষরবিহীন পূর্ণসংখ্যার প্রকারের ব্যবহারকে নিরুৎসাহিত করা, এবং যতদূর আমি জানি জাভা বা স্কালা উভয়েরই স্বাক্ষরযুক্ত পূর্ণসংখ্যার প্রকার নেই।

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


উত্তর:


31

এটি নিয়ে দুটি চিন্তাভাবনা বিদ্যালয় রয়েছে, এবং উভয়ই কখনও রাজি হবে না।

প্রথমটি যুক্তি দেয় যে কিছু ধারণা আছে যা সহজাত স্বাক্ষরযুক্ত - যেমন অ্যারে সূচকগুলি। এটির জন্য স্বাক্ষরযুক্ত নম্বরগুলি ব্যবহার করার কোনও অর্থ নেই কারণ এটি ত্রুটি হতে পারে to এটি জিনিসগুলিতেও অপ্রয়োজনীয় সীমাবদ্ধতা আরোপ করতে পারে - স্বাক্ষরিত 32-বিট সূচকগুলি ব্যবহার করে এমন একটি অ্যারে কেবল 2 বিলিয়ন প্রবেশিকা অ্যাক্সেস করতে পারে, যখন স্বাক্ষরযুক্ত 32-বিট সংখ্যায় স্যুইচ করা 4 বিলিয়ন এন্ট্রিকে অনুমতি দেয়।

দ্বিতীয় যুক্তি দেখায় যে যে কোনও প্রোগ্রামে স্বাক্ষরবিহীন সংখ্যা ব্যবহার করা হয়, তাড়াতাড়ি বা পরে আপনি মিশ্র স্বাক্ষরিত-স্বাক্ষরবিহীন গাণিতিকগুলি শেষ করবেন। এটি বিস্ময়কর এবং অপ্রত্যাশিত ফলাফল দিতে পারে: স্বাক্ষরিতকে একটি বড় স্বাক্ষরিত মান castালাই একটি negativeণাত্মক সংখ্যা দেয় এবং বিপরীতে স্বাক্ষরযুক্ত একটি নেতিবাচক সংখ্যা কাস্টিং একটি বড় ধনাত্মক দেয়। এটি ত্রুটির একটি বৃহত উত্স হতে পারে।


8
সংমিশ্রিত স্বাক্ষরযুক্ত স্বাক্ষরিত গাণিতিক সমস্যাগুলি সংকলক দ্বারা সনাক্ত করা হয়; কেবলমাত্র আপনার বিল্ডকে সতর্কতা-মুক্ত রাখুন (একটি উচ্চ পর্যায়ে সতর্কতা স্তর সহ)। এছাড়াও, intটাইপ করতে সংক্ষিপ্ত রয়েছে :)
রুকমজু

7
স্বীকারোক্তি: আমি দ্বিতীয় বিদ্যালয়ের সাথে আছি এবং আমি স্বাক্ষরবিহীন প্রকারের জন্য বিবেচ্য বিষয়গুলি বুঝতে পেরেছি: intray৯.৯৯% বারের অ্যারে সূচকের পক্ষে যথেষ্ট। স্বাক্ষরযুক্ত - স্বাক্ষরবিহীন গাণিতিক সমস্যাগুলি অনেক বেশি সাধারণ এবং তাই কী এড়াতে হবে তার ক্ষেত্রে অগ্রাধিকার গ্রহণ করে। হ্যাঁ, সংকলকগণ আপনাকে এ সম্পর্কে সতর্ক করে, তবে কোনও বৃহত্ প্রকল্পকে সংকলন করার সময় আপনি কতগুলি সতর্কতা পান? সতর্কবাণী উপেক্ষা করা বিপজ্জনক, এবং খারাপ অনুশীলন, কিন্তু বাস্তব বিশ্বে ...
এলিয়াস ভ্যান ওটেজেম

11
উত্তর +1। সাবধানতা : এগিয়ে ধোঁয়া মতামত : 1: দ্বিতীয় বিদ্যালয়ের আমার প্রতিক্রিয়াটি হ'ল: আমি অর্থ ব্যয় করব যে সি-এ স্বাক্ষরযুক্ত ইন্টিগ্রাল ধরণের ফলে অপ্রত্যাশিত ফলাফল পাবে তার যে অপরিজ্ঞাত আচরণ করবে (এবং খাঁটি-একাডেমিক ধরণের নয়) তাদের অ-তুচ্ছ সি প্রোগ্রামগুলি যা স্বাক্ষরিত ইন্টিগ্রাল টাইপ ব্যবহার করে । আপনি যদি সি সম্পর্কে ভালভাবে না জানেন যে স্বাক্ষরযুক্ত প্রকারগুলি ব্যবহার করা আরও ভাল , তবে আমি সি এড়ানোর পরামর্শ দিই 2: অ্যারে সূচি এবং মাপের সি এর জন্য ঠিক একটি সঠিক প্রকার রয়েছে, এবং এটি size_tযদি না থাকে তবে একটি বিশেষ ক্ষেত্রে নেই অন্যথায় ভাল কারণ।
mtraceur

5
আপনি মিশ্র স্বাক্ষর ছাড়াই সমস্যায় পড়েন। কেবল স্বাক্ষরবিহীন ইন বিয়োগ চিহ্ন স্বাক্ষরবিহীন int গণনা করুন।
gnasher729

4
আপনার সাথে সাইমন ইস্যুটি গ্রহণ করছেন না, কেবলমাত্র প্রথম বিদ্যালয়ের সাথেই যে যুক্তি দেয় যে "এমন কিছু ধারণা রয়েছে যা স্বভাবত স্বাক্ষরযুক্ত - যেমন অ্যারে সূচকগুলি।" বিশেষত: "অ্যারে সূচকগুলির জন্য ঠিক একটি সঠিক প্রকার রয়েছে ... সি তে" বুলশিট! । আমরা ডিএসপিরা সমস্ত সময় নেতিবাচক সূচকগুলি ব্যবহার করি। বিশেষত এমনকি অদ্ভুত-প্রতিসাম্য প্রবণতা প্রতিক্রিয়াগুলি যা অ-কার্যকারণীয় with এবং লুথ গণিত জন্য। আমি দ্বিতীয় বিদ্যালয়ের চিন্তায় আছি, তবে আমি মনে করি যে সি এবং সি ++ তে স্বাক্ষরযুক্ত এবং স্বাক্ষরযুক্ত উভয়ই ইন্টিজার ব্যবহার করা কার্যকর।
রবার্ট ব্রিস্টো-জনসন

21

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

সি ++ এর জন্য থাম্বের একটি শালীন নিয়ম: intআপনার যদি অন্য কোনও কিছু ব্যবহার করার উপযুক্ত কারণ না থাকে তবে পছন্দ করুন prefer


8
আমি মোটেই বোঝাতে চাইছি না। কনস্ট্রাক্টররা হানাদার প্রতিষ্ঠা করার জন্য, এবং যেহেতু তারা ফাংশন না করে কেবলমাত্র return falseযদি সেই আক্রমণকারী প্রতিষ্ঠিত না হয় তবে তারা তা করতে পারে না । সুতরাং, আপনি হয় জিনিস আলাদা করতে পারেন এবং আপনার অবজেক্টগুলির জন্য init ক্রিয়াকলাপগুলি ব্যবহার করতে পারেন, বা আপনি একটি নিক্ষেপ করতে পারেন std::runtime_error, অযাচিত স্ট্যাকটি ঘটতে দিন এবং আপনার সমস্ত RAII অবজেক্টগুলি স্বয়ংক্রিয়ভাবে সাফ করুন এবং আপনি বিকাশকারী ব্যতিক্রমটি পরিচালনা করতে পারেন যেখানে এটি সুবিধাজনক is আপনি এটি করতে।
bstamour

5
অ্যাপ্লিকেশনটির ধরণ কীভাবে তাত্পর্য তৈরি করে তা আমি দেখছি না। যে কোনও সময় আপনি কোনও বস্তুতে কোনও কনস্ট্রাক্টরকে কল করুন আপনি পরামিতিগুলির সাথে একটি আক্রমণকারী স্থাপন করছেন। যদি সেই আক্রমণকারীটির সাথে দেখা করা যায় না, তবে আপনাকে একটি ত্রুটি সংকেত দেওয়া দরকার অন্যথায় আপনার প্রোগ্রামটি ভাল অবস্থায় নেই। যেহেতু কনস্ট্রাক্টররা পতাকা ফিরিয়ে দিতে পারে না, তাই ব্যতিক্রম ছোঁড়া একটি প্রাকৃতিক বিকল্প। কোনও ব্যবসায়ের অ্যাপ্লিকেশন কেন এমন কোডিং শৈলী থেকে উপকৃত হবে না তা সম্পর্কে একটি দৃ argument় যুক্তি দিন।
bstamour

8
আমি অত্যন্ত সন্দেহ করি যে সমস্ত সি ++ প্রোগ্রামারগুলির অর্ধেক ব্যতিক্রমগুলি সঠিকভাবে ব্যবহার করতে অক্ষম। তবে যাইহোক আপনি যদি মনে করেন যে আপনার সহকর্মীরা আধুনিক সি ++ লিখতে অক্ষম তবে কোনও উপায়ে আধুনিক সি ++ থেকে দূরে থাকুন।
bstamour

6
@ zzz777 ব্যতিক্রম ব্যবহার করবেন না? ব্যাক্তিগত ফ্যাক্টরি ফাংশন দ্বারা মোড়কযুক্ত বেসরকারী নির্মাতারা কি ব্যতিক্রমগুলি ধরেন এবং কী করেন - রিটার্ন এ nullptr? একটি "ডিফল্ট" অবজেক্ট ফিরিয়ে আনুন (এর অর্থ যাই হোক না কেন)? আপনি কোনও কিছুই সমাধান করেন নি - আপনি সমস্যাটি কেবল একটি কার্পেটের নীচে লুকিয়ে রেখেছেন এবং আশা করি কেউ এটির সন্ধান করবে না।
মেল

5
@ zzz777 আপনি যদি যাইহোক বাক্সটি ক্র্যাশ করতে চলেছেন তবে যদি এটি ব্যতিক্রম থেকে ঘটে তবে আপনি কেন যত্ন করবেন signal(6)? আপনি যদি কোনও ব্যতিক্রম ব্যবহার করেন তবে 50% বিকাশকারী যারা তাদের সাথে কীভাবে আচরণ করতে জানে তারা ভাল কোড লিখতে পারে এবং বাকী অংশটি তাদের সহকর্মীরা বহন করতে পারেন।
IllusiveBrian

6

অন্যান্য উত্তরগুলির বাস্তব বিশ্বের উদাহরণগুলির অভাব রয়েছে, তাই আমি একটি যুক্ত করব। আমি (ব্যক্তিগতভাবে) স্বাক্ষরযুক্ত প্রকারগুলি এড়িয়ে যাওয়ার চেষ্টা করার একটি কারণ।

অ্যারে সূচক হিসাবে স্ট্যান্ডার্ড সাইজ_ট ব্যবহার করার বিষয়টি বিবেচনা করুন:

for (size_t i = 0; i < n; ++i)
    // do something here;

ঠিক আছে, পুরোপুরি স্বাভাবিক তারপরে, বিবেচনা করুন আমরা কোনও কারণে লুপের দিক পরিবর্তন করার সিদ্ধান্ত নিয়েছি:

for (size_t i = n - 1; i >= 0; --i)
    // do something here;

এবং এখন এটি কাজ করে না। আমরা যদি intপুনরুক্তি হিসাবে ব্যবহার করি তবে কোনও সমস্যা হবে না। আমি গত দুই বছরে দু'বার এ জাতীয় ত্রুটি দেখেছি। একবার এটি উত্পাদনে ঘটেছিল এবং ডিবাগ করা শক্ত ছিল hard

আমার আর একটি কারণ বিরক্তিকর সতর্কতা, যা আপনাকে প্রতিবারের মতো কিছু লিখতে বাধ্য করে :

int n = 123;  // for some reason n is signed
...
for (size_t i = 0; i < size_t(n); ++i)

এগুলি ছোটখাটো জিনিস, তবে তারা যোগ করে। আমি মনে করি কোডটি ক্লিনার হলে কেবল স্বাক্ষরিত পূর্ণসংখ্যাগুলি সর্বত্র ব্যবহৃত হয়।

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

আমি যখন ভিএস ২০১৫ বা জিসিসির সাথে নিম্নলিখিত কোডের টুকরোটি সংকলন করি তখন আমি ডিফল্ট সতর্কতা সেটিংস (এমনকি জিসিসির জন্য ওয়াল সহ) সহ কোনও সতর্কতা দেখতে পাই না। জিসিসিতে এই সম্পর্কে একটি সতর্কতা পেতে আপনাকে ওয়েক্সট্রার কাছে জিজ্ঞাসা করতে হবে। ওয়াল এবং ওয়েক্সট্রা (এবং স্ট্যাটিক বিশ্লেষক ব্যবহার করুন) দিয়ে আপনার সর্বদা সংকলন করা উচিত এর একটি কারণ তবে অনেকগুলি বাস্তব জীবনের প্রকল্পে লোকেরা তা করে না।

#include <vector>
#include <iostream>


void unsignedTest()
{
    std::vector<int> v{ 1, 2 };

    for (int i = v.size() - 1; i >= 0; --i)
        std::cout << v[i] << std::endl;

    for (size_t i = v.size() - 1; i >= 0; --i)
        std::cout << v[i] << std::endl;
}

int main()
{
    unsignedTest();
    return 0;
}

আপনি স্বাক্ষরযুক্ত ধরণের সাথে এটি আরও বেশি ভুল করতে পারেন ... এবং আপনার উদাহরণ-কোডটি মস্তিষ্ক-মৃত এবং স্পষ্টতই ভুল কোনও শালীন সংকলক সতর্ক করবে যদি আপনি সতর্কতা চেয়ে থাকেন তবে for
অনুচ্ছেদে

1
আমি অতীতে for (size_t i = n - 1; i < n; --i)এটিকে সঠিকভাবে কাজ করার জন্য এমন ভয়াবহতার আশ্রয় নিয়েছিলাম ।
সাইমন বি

2
সঙ্গে জন্য-লুপ কথা বলছেন size_tবিপরীত, সেখানে শৈলী একটি কোডিং নির্দেশিকাfor (size_t revind = 0u; revind < n; ++revind) { size_t ind = n - 1u - revind; func(ind); }
rwong

2
@ রওং ওমগ, এটি কুরুচিপূর্ণ। শুধু ব্যবহার intকরবেন না কেন ? :)
আলেক্সেই পেট্রেনকো

1
@ অ্যালেক্সি পেট্রেনকো - নোট করুন যে বর্তমান সি বা সি ++ মানদণ্ডের মধ্যে কোনওটিই গ্যারান্টি দেয় না যে এর intসমস্ত বৈধ মান ধরে রাখতে যথেষ্ট size_t। বিশেষত, intকেবলমাত্র 2 ^ 15-1 অবধি সংখ্যাগুলি মঞ্জুরি দেয় এবং সাধারণত এমন সিস্টেমে মেমরি বরাদ্দ সীমা 2 ^ 16 (বা কিছু ক্ষেত্রে আরও উচ্চতর) থাকে। longএটি একটি নিরাপদ বাজি হতে পারে, যদিও এখনও কাজের নিশ্চয়তা নেইsize_tসমস্ত প্ল্যাটফর্ম এবং সমস্ত ক্ষেত্রে কেবল কাজ করার গ্যারান্টিযুক্ত।
জুলাই

4
for (size_t i = v.size() - 1; i >= 0; --i)
   std::cout << v[i] << std::endl;

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

for (size_t i = v.size(); i-- > 0; )
    std::cout << v[i] << std::endl;

এই পরিবর্তনটি কেবল তুলনার ক্রম এবং হ্রাস অপারেশনটিকে সরিয়ে দেয় এবং আমার মতে পশ্চাদপদ লুপগুলিতে স্বাক্ষরবিহীন কাউন্টারগুলি পরিচালনা করার সবচেয়ে কার্যকর, আনস্টিবার্বিং, ক্লিন এবং শর্টস উপায়। কিছুক্ষণ লুপ ব্যবহার করার সময় আপনি খুব একই জিনিসটি (স্বজ্ঞাগতভাবে) করবেন:

size_t i = v.size();
while (i > 0)
{
    --i;
    std::cout << v[i] << std::endl;
}

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

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

আছে HTH


1

স্বাক্ষরবিহীন পূর্ণসংখ্যার কারণ আছে।

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

অথবা অক্ষর দেখার সারণী ব্যবহার করে অ্যালগরিদমগুলি সম্পর্কে ভাবেন। যদি কোনও অক্ষর একটি 8-বিট স্বাক্ষরবিহীন পূর্ণসংখ্যা হয়, আপনি অক্ষরটির মান অনুসারে একটি সন্ধানের টেবিলটিকে সূচক করতে পারেন। যাইহোক, প্রোগ্রামিং ভাষা স্বাক্ষরযুক্ত পূর্ণসংখ্যার সমর্থন না করে আপনি কি করবেন? আপনার একটি অ্যারেতে নেতিবাচক সূচি থাকবে। ঠিক আছে, আমি অনুমান করি আপনি charval + 128এর মতো কিছু ব্যবহার করতে পারেন তবে এটি কেবল কুৎসিত।

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

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

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

আমি যুক্তি দিয়ে বলব যে স্বাক্ষরবিহীন পূর্ণসংখ্যার প্রকারগুলি (মিশ্র সাইন গাণিতিক, মিশ্র চিহ্নের তুলনা) ব্যবহার করা এড়াতে ন্যায্যতা যথাযথ সতর্কতা সহ একটি সংকলক দ্বারা অতিক্রম করা যায়। এই ধরনের সতর্কতাগুলি সাধারণত ডিফল্ট হিসাবে সক্ষম হয় না তবে উদাহরণস্বরূপ -Wextraবা পৃথকভাবে দেখুন -Wsign-compare(সি দ্বারা স্বয়ংক্রিয়-সক্ষম হওয়া -Wextraসত্ত্বেও, যদিও আমি মনে করি না এটি সি ++ এ স্বয়ংক্রিয়-সক্ষম হয়েছে) এবং -Wsign-conversion

তবুও যদি সন্দেহ হয় তবে একটি স্বাক্ষরিত প্রকারটি ব্যবহার করুন। অনেক সময়, এটি একটি পছন্দ যা ভালভাবে কাজ করে। এবং এই সংকলক সতর্কতা সক্ষম করুন!


0

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

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

খুব বিরল ক্ষেত্রে যেখানে সূচকগুলি 2 ^ 31 ছাড়িয়ে গেছে তবে 2 ^ 32 নয়, আপনি স্বাক্ষরবিহীন পূর্ণসংখ্যা ব্যবহার করেন না, আপনি 64 বিট পূর্ণসংখ্যা ব্যবহার করেন।

শেষ অবধি, একটি সুন্দর ফাঁদ: "লুপের জন্য" (i = 0; i <n; ++ i) এ [i] ... "যদি আমি 32 বিট স্বাক্ষরিত না হয় এবং মেমরি 32 বিট ঠিকানার চেয়ে বেশি হয়, সংকলকটি অনুকূলিত করতে পারে না পয়েন্টার বাড়িয়ে একটি [i] এ অ্যাক্সেস করা যায়, কারণ i = 2 ^ 32 - 1 এ আমি চারপাশে আবৃত। এমনকি এন কখনই বড় হয় না। স্বাক্ষরিত পূর্ণসংখ্যা ব্যবহার এড়ানো যায়।


-5

অবশেষে, আমি এখানে সত্যিই একটি ভাল উত্তর পেয়েছি: জে ভিগা এবং এম। ম্যাসিয়ের দ্বারা "সুরক্ষিত প্রোগ্রামিং কুকবুক" ( http://shop.oreilly.com/product/9780596003944.do )

স্বাক্ষরিত পূর্ণসংখ্যার সাথে সুরক্ষা সম্পর্কিত সমস্যা:

  1. যদি ফাংশনটির কোনও ধনাত্মক প্যারামিটার প্রয়োজন হয় তবে নিম্ন পরিসরটি পরীক্ষা করা ভুলে যাওয়া সহজ।
  2. Negativeণাত্মক পূর্ণসংখ্যার আকার রূপান্তরগুলি থেকে স্বল্প বিট প্যাটার্ন।
  3. Aণাত্মক পূর্ণসংখ্যার ডান শিফট অপারেশন দ্বারা উত্পাদিত অনিয়মিত বিট প্যাটার্ন।

স্বাক্ষরিত <-> স্বাক্ষরযুক্ত রূপান্তরগুলির সাথে সমস্যা রয়েছে তাই মিশ্রণটি ব্যবহার করার পরামর্শ দেওয়া হয় না।


1
কেন এটি একটি ভাল উত্তর? রেসিপি 3.5 কি? এটি পূর্ণসংখ্যা ওভারফ্লো ইত্যাদি সম্পর্কে কী বলে?
বাল্ড্রিক

আমার ব্যবহারিক অভিজ্ঞতায় আমি চেষ্টা করেছি যে সমস্ত দিকগুলিতে মূল্যবান পরামর্শ সহ এটি খুব ভাল বই এবং এটি এই সুপারিশে বেশ দৃ firm়। 4 জি এর চেয়ে বেশি অ্যারেতে পূর্ণসংখ্যার ওভারফ্লো প্রবাহের সেই বিপদগুলির সাথে তুলনা করা বেশ দুর্বল বলে মনে হচ্ছে। যদি আমাকে এত বড় অ্যারেগুলি নিয়ে কাজ করতে হয় তবে পারফরম্যান্সের জরিমানা এড়াতে আমার প্রোগ্রামটিতে প্রচুর সূক্ষ্ম সুর পাওয়া যাবে।
zzz777

1
বইটি ভাল কিনা তা নিয়ে নয়। আপনার উত্তরটি রিসিপি ব্যবহারের জন্য কোনও ন্যায়সঙ্গততা দেয় না এবং বইটি দেখার জন্য প্রত্যেকেরই বইয়ের একটি অনুলিপি থাকবে না। কীভাবে একটি ভাল উত্তর লিখতে হয় তার উদাহরণগুলি দেখুন
বাল্ড্রিক ২

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