স্বাক্ষরবিহীন ints সম্পর্কিত সেরা অভ্যাসগুলি কি কি?


43

আমি সর্বত্র স্বাক্ষরবিহীন ইনট ব্যবহার করি এবং আমার নিশ্চিত হওয়া উচিত কিনা তা নিশ্চিত নই। এটি ডাটাবেস প্রাথমিক কী আইডি কলাম থেকে কাউন্টার ইত্যাদিতে হতে পারে a যদি কোনও সংখ্যা কখনও নেতিবাচক না হয় তবে আমি সর্বদা একটি স্বাক্ষরবিহীন ইন্ট ব্যবহার করব।

তবে আমি অন্যের কোড থেকে লক্ষ্য করেছি যে অন্য কেউ এগুলি করছে বলে মনে হচ্ছে না। এমন কি গুরুতর কিছু আছে যা আমি উপেক্ষা করছি?

সম্পাদনা: যেহেতু এই প্রশ্নটি আমি এও লক্ষ্য করেছি যে সি তে, ত্রুটিগুলির জন্য নেতিবাচক মানগুলি ফিরানো সি ++ এর মতো ব্যতিক্রম ছোঁড়ার চেয়ে সাধারণ বিষয়।


26
খালি নজর রাখুন for(unsigned int n = 10; n >= 0; n --)(অসীম লুপগুলি)
ক্রিস বার্ট-ব্রাউন

3
সি এবং সি ++ এ, স্বাক্ষরবিহীন ইনটগুলি যথাযথভাবে ওভারফ্লো আচরণের সংজ্ঞা দিয়েছে (মডুলো 2 ^ n)। সাইন ইন্টস না। অপ্টিমাইজাররা ক্রমবর্ধমানভাবে এই অপরিশোধিত ওভারফ্লো আচরণটি কাজে লাগিয়ে কিছু ক্ষেত্রে আশ্চর্যজনক ফলাফলের দিকে নিয়ে যায়।
স্টিভ 314

2
ভাল প্রশ্ন! আমিও একবার ইউএনটস টি সীমাবদ্ধ সীমাবদ্ধতা ব্যবহার করার জন্য প্রলুব্ধ হয়েছিলাম তবে দেখেছি যে ঝুঁকি / অসুবিধাটি কোনও সুবিধা / সুবিধাকে ছাড়িয়ে গেছে। বেশিরভাগ লাইব্রেরি, যেমন আপনি বলেছিলেন, নিয়মিত ইনট গ্রহণ করুন যেখানে কোনও ছোঁড়াছুড়ি করবে। এটি এর সাথে কাজ করা কঠিন করে তোলে, তবে প্রশ্নটিও করে: এটি কি মূল্যবান? অনুশীলনে (ধরে নিবেন যে আপনি বোবা পথে জিনিসগুলি নিয়ে যান না), আপনার খুব কমই -218 এর মান আসবে যেখানে ইতিবাচক আশা করা হয়। -218 নিশ্চয়ই কোথাও থেকে এসেছেন, তাই না? এবং আপনি এর উত্স সনাক্ত করতে পারেন। খুব কমই ঘটে। আপনাকে সহায়তা করার জন্য দৃser়তা, ব্যতিক্রম, কোড চুক্তি ব্যবহার করবেন না।
কাজ

@ উইলিয়াম টিং: এটি যদি কেবল সি / সি ++ সম্পর্কিত হয় তবে আপনার প্রশ্নে আপনার উপযুক্ত ট্যাগ যুক্ত করা উচিত।
সিজারগন

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

উত্তর:


28

এমন কি গুরুতর কিছু আছে যা আমি উপেক্ষা করছি?

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

আমি বিশ্বাস করি যে জাভা স্বাক্ষরযুক্ত স্বাক্ষরিত প্রকারভেদ বাদ দেওয়ার মূল কারণ reason


3
আর একটি সমাধান হ'ল আপনার নিজের সংখ্যা যথাযথভাবে কাস্ট করতে হবে। এটি যা করতে পারে বলে মনে হচ্ছে (আমি এটির সাথে কেবলমাত্র একটি ছোট্ট কিছুটা খেলেছি), এবং আমি জাভা এর পদ্ধতির চেয়ে এটি বেশি পছন্দ করি।
টিখন জেলভিস

2
জাভাতে -৪-বিট স্বাক্ষরযুক্ত প্রকারটি অন্তর্ভুক্ত না করার একটি ভাল কারণ ছিল এবং সম্ভবত 32-বিট স্বাক্ষরযুক্ত প্রকারটি অন্তর্ভুক্ত না করার একটি শালীন কারণ [যদিও স্বাক্ষরযুক্ত এবং স্বাক্ষরযুক্ত 32-বিট মানগুলি যুক্ত করার শব্দার্থকতা শক্ত হবে না - এই জাতীয় ক্রিয়াকলাপে কেবল একটি -৪-বিট স্বাক্ষরিত ফলাফল পাওয়া উচিত]। এর চেয়ে ছোট স্বাক্ষরযুক্ত প্রকারের ক্ষেত্রে এ intজাতীয় কোনও অসুবিধা নেই, তবে (যেহেতু কোনও গণনাগুলি উন্নীত করবে int); স্বাক্ষরযুক্ত-বাইট টাইপের অভাব সম্পর্কে আমার বলার মতো ভাল কিছু নেই।
সুপারক্যাট

17

আমি মনে করি যে মাইকেলটির একটি বৈধ পয়েন্ট রয়েছে তবে আইএমওর কারণ প্রত্যেকে সর্বদা ইনট ব্যবহার করে (বিশেষত for (int i = 0; i < max, i++) আমরা এটি সেভাবে শিখেছি। যখন একটি ' প্রোগ্রামিং শিখতে হবে ' বইয়ের প্রতিটি একক উদাহরণ যখন লুপে ব্যবহার intকরে for, তখন খুব কম লোকই এই অনুশীলনটিকে প্রশ্ন করবে।

অন্য কারণটি হ'ল int25% এর চেয়ে কম uint, এবং আমরা সবাই অলস ... ;-)


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

1
এগুলি সম্ভবতঃ কেন ++বৃদ্ধির সময় প্রত্যেকে পোস্টফিক্স ব্যবহার করে , যদিও এর নির্দিষ্ট আচরণটি খুব কমই প্রয়োজন হয় এবং লুপ সূচকটি যদি একটি পুনরায় বা অন্য কোনও মৌলিক ধরণের হয় (বা সংকলকটি সত্যই ঘন হয়) তবে অনুলিপিগুলিতে অনর্থক মন্থনের কারণও হতে পারে or ।
আন্ডারস্কোর_ডি

"For (uint i = 10; i> = 0; --i)" এর মতো কিছু করবেন না। লুপ ভেরিয়েবলের জন্য কেবলমাত্র ints ব্যবহার করা এই সম্ভাবনাটিকে এড়িয়ে চলে।
ডেভিড থর্নলি

11

প্রকারভেদে পরিসীমা সম্পর্কিত তথ্য এনকোডিং হ'ল একটি ভাল জিনিস। এটি সংকলনের সময় যুক্তিসঙ্গত সংখ্যা ব্যবহার করে প্রয়োগ করে।

অনেকগুলি আর্কিটেকচারে int-> floatরূপান্তরগুলি নিয়ে কাজ করার জন্য বিশেষ নির্দেশাবলী রয়েছে বলে মনে হয় । থেকে রূপান্তরটি unsignedধীর হতে পারে (একটি সামান্য বিট)


8

স্বাক্ষরযুক্ত এবং স্বাক্ষরবিহীন প্রকারের মিশ্রণ আপনাকে বেদনার জগতে নিয়ে যেতে পারে। এবং আপনি সমস্ত স্বাক্ষরবিহীন প্রকারগুলি ব্যবহার করতে পারবেন না কারণ আপনি এমন জিনিসগুলির মুখোমুখি হবেন যেগুলির মধ্যে বৈধ পরিসীমা রয়েছে যার মধ্যে নেতিবাচক সংখ্যা রয়েছে বা একটি ত্রুটি চিহ্নিত করার জন্য একটি মান প্রয়োজন এবং -1 সবচেয়ে স্বাভাবিক। সুতরাং নেট ফলাফলটি হ'ল অনেক প্রোগ্রামার সমস্ত স্বাক্ষরিত পূর্ণসংখ্যার প্রকার ব্যবহার করে।


1
একই ভেরিয়েবলের মধ্যে ত্রুটির ইঙ্গিত সহ বৈধ মানগুলি না মিশানো এবং এর জন্য পৃথক ভেরিয়েবল ব্যবহার না করা ভাল অভ্যাস। মঞ্জুর, সি স্ট্যান্ডার্ড লাইব্রেরি এখানে ভাল উদাহরণ স্থাপন করে না।
সুরক্ষিত করুন

7

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

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


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

@ জোব আমি বলব যে আপনার মাসগুলিতে আপনার একরকম সংকলক / দোভাষা বলবতী বিধিনিষেধ ব্যবহার করা উচিত। এটি আপনাকে সেট আপ করতে কিছু বয়লারপ্লেট দিতে পারে, তবে ভবিষ্যতের জন্য আপনার কাছে বলবতীয় বিধিনিষেধ রয়েছে যা ত্রুটি প্রতিরোধ করে এবং আপনি কী প্রত্যাশা করছেন তা আরও পরিষ্কারভাবে যোগাযোগ করে। ত্রুটি রোধ করা এবং যোগাযোগ সহজ করা বাস্তবায়নের সময় অসুবিধার চেয়ে অনেক বেশি গুরুত্বপূর্ণ।
daramarak

1
"আমি আমার মানগুলি এক মাসের মধ্যে কেবলমাত্র 12 থেকে 12 পর্যন্ত সীমাবদ্ধ রাখতে চাই" যদি আপনার কাছে মাসের মতো মানের একটি সীমাবদ্ধ থাকে তবে আপনার কোনও অঙ্কের ধরণ ব্যবহার করা উচিত, কাঁচা পূর্ণসংখ্যার নয়।
জোশ ক্যাসওয়েল

6

আমি unsigned intসি ++ এ অ্যারে সূচকগুলির জন্য, বেশিরভাগ ক্ষেত্রেই ব্যবহার করি এবং যে কোনও কাউন্টারের জন্য যা 0 থেকে শুরু হয় think


14
আপনার সম্ভবত সি ++ এর জন্য
সাইজ_টি

2
আমি জানি, আমার শুধু বিরক্ত করা যায় না।
কোয়ান্ট_দেব

3

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

আমি বলব: আপনি যদি না স্বাক্ষরযুক্ত কোন প্রয়োজন না জেনে অবধি ব্যবহার করুন।


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

3

এটি সরলতা এবং নির্ভরযোগ্যতার মধ্যে একটি বাণিজ্য। সংকলনের সময় যত বেশি বাগ ধরা যায় তত নির্ভরযোগ্য সফ্টওয়্যার। সেই বর্ণালীতে বিভিন্ন ব্যক্তি এবং সংস্থা বিভিন্ন পয়েন্টে রয়েছে।

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


2

আমি জোয়েল ইথারটনের যুক্তির সাথে একমত হতে আগ্রহী, তবে এর বিপরীতে সিদ্ধান্তে এসেছি। আমি এটি যেভাবে দেখছি, এমনকি যদি আপনি জানেন যে সংখ্যাগুলি কোনও স্বাক্ষরিত ধরণের সীমাতে পৌঁছানোর সম্ভাবনা কম থাকে তবে আপনি যদি জানেন যে negativeণাত্মক সংখ্যাগুলি ঘটবে না, তবে কোনও প্রকারের স্বাক্ষরিত রূপটি ব্যবহার করার খুব কম কারণ রয়েছে is

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

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


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

1

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

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


1
"আমি সুপারিশ করব [...] সাধারণত স্বাক্ষরিত প্রকারগুলি ব্যবহার করুন।" হুঁ, আপনি স্বাক্ষরিত ধরণের সুবিধার কথা উল্লেখ করতে ভুলে গিয়েছিলেন এবং স্বাক্ষরযুক্ত প্রকারগুলি কখন ব্যবহার করবেন তার একটি তালিকা দিয়েছিলেন। "অদ্ভুততা" ? বেশিরভাগ স্বাক্ষরযুক্ত অপারেশনগুলিতে ভাল সংজ্ঞাযুক্ত আচরণ এবং ফলাফল রয়েছে, আপনি স্বাক্ষরিত প্রকারগুলি (ওভারফ্লো, বিট শিফট, ...) ব্যবহার করার সময় অপরিজ্ঞাত এবং বাস্তবায়ন সংজ্ঞায়িত আচরণ প্রবেশ করেন। আপনার এখানে "অদ্ভুততা" এর একটি অদ্ভুত সংজ্ঞা রয়েছে।
সুরক্ষিত

1
@ সিকিউর: আমি যে "অদ্ভুততা" উল্লেখ করেছি তা তুলনা অপারেটরদের শব্দার্থতত্ত্বের সাথে সম্পর্কিত, বিশেষত অপারেশনগুলিতে যা মিশ্র স্বাক্ষরিত এবং স্বাক্ষরযুক্ত প্রকারের সাথে জড়িত। আপনি সঠিক যে স্বাক্ষরযুক্ত ধরণের আচরণগুলি অপরিবর্তিত হওয়ার জন্য পর্যাপ্ত পরিমাণে মানগুলি ব্যবহার করার সময় সংজ্ঞায়িত, তবে স্বাক্ষরযুক্ত প্রকারের আচরণ অপেক্ষাকৃত কম সংখ্যার সাথে আচরণ করার পরেও অবাক করে দিতে পারে। উদাহরণস্বরূপ, (-3) + (1u) -1 এর চেয়ে বড়। এছাড়াও, কিছু সাধারণ গাণিতিক সহযোগী সম্পর্ক যা সংখ্যায় প্রযোজ্য তা স্বাক্ষরবিহীন ক্ষেত্রে প্রযোজ্য নয়। উদাহরণস্বরূপ, (আব)> সি বোঝায় না (এসি)> বি।
সুপারক্যাট

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

1
এই মন্তব্যগুলি যদি কোনও কারণ না দিয়ে সুপারিশ এবং "নাম ডাকার" পরিবর্তে প্রথমে আপনার উত্তরে থাকে, তবে আমি এ সম্পর্কে মন্তব্য করব না। ;) যদিও আমি এখানে "অদ্ভুততা" এর সাথে একমত নই, তবে এটি কেবল ধরণের সংজ্ঞা। প্রদত্ত কাজের জন্য সঠিক সরঞ্জামটি ব্যবহার করুন এবং অবশ্যই সরঞ্জামটি জানুন। আপনার +/- সম্পর্কের প্রয়োজন হলে স্বাক্ষরযুক্ত প্রকারগুলিই ভুল সরঞ্জাম tool size_tস্বাক্ষরবিহীন এবং স্বাক্ষরিত হওয়ার কারণ রয়েছে ptrdiff_t
সুরক্ষিত করুন

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

1

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

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

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

উদাহরণস্বরূপ, সম্প্রতি আমার কাছে এমন কিছু লুপের জন্য ছিল:

const unsigned short cuint = 5;
for(unsigned short i=0; i<10; ++i)
{
    if((i-2)%cuint == 0)
    {
       //Do something
    }
}

আক্ষরিক '2' টাইপ ইন্টের হয়। আমি যদি স্বাক্ষরবিহীন শর্টের পরিবর্তে স্বাক্ষরবিহীন অন্তর্ভুক্ত ছিলাম তবে উপ-এক্সপ্রেশনটিতে (আই -২), ২ কে স্বাক্ষরবিহীন ইনট হিসাবে উন্নীত করা হবে (যেহেতু স্বাক্ষরযুক্ত স্বাক্ষরের চেয়ে বেশি অগ্রাধিকার রয়েছে)। যদি i = 0 হয়, তবে উপ-এক্সপ্রেশন সমান (0u-2u) = অতিরিক্ত প্রবাহের কারণে কিছু বিশাল মান। আই = ১ নিয়ে একই ধারণা, তবে আমি যেহেতু স্বাক্ষরবিহীন সংক্ষিপ্ত, তাই এটি আক্ষরিক '2' এর মতো একই ধরণের হয়ে যায়, যা স্বাক্ষরযুক্ত এবং সমস্ত কিছুই ঠিকঠাক কাজ করে।

অতিরিক্ত সুরক্ষার জন্য: বিরল ক্ষেত্রে যেখানে আপনি যে আর্কিটেকচারটি প্রয়োগ করছেন তাতে 2 বাইট হওয়ার কারণ রয়েছে, এটি পাটিগণিতের এক্সপ্রেশনটিতে উভয় অপারেশনকে স্বাক্ষরযুক্ত ইনট হিসাবে উন্নীত করতে পারে যেখানে স্বাক্ষরযুক্ত স্বল্প ভেরিয়েবল ফিট না করে might স্বাক্ষরিত 2-বাইট ইন্টিতে, যার পরবর্তীটির সর্বাধিক মান 32,767 <65,535। ( আরও তথ্যের জন্য https://stackoverflow.com/questions/17832815/c-implicit-conversion-sided- স্বাক্ষরিত দেখুন )। এর থেকে রক্ষা পেতে আপনি কেবল আপনার প্রোগ্রামে একটি স্ট্যাটিক_সেসার্টটি নীচের মতো যুক্ত করতে পারেন:

static_assert(sizeof(int) == 4, "int must be 4 bytes");

এবং এটি আর্কিটেক্টগুলিতে সংকলন করবে না যেখানে int 2 বাইট রয়েছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.