'ইউিন্ট' এবং 'শর্ট' ডেটাটাইপগুলি স্ট্যান্ডার্ড ইনট (32) এর চেয়ে ভাল ফিট হওয়ার ক্ষেত্রে কোনটি রয়েছে?


24

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

উদ্দেশ্যমূলকভাবে, এমন কোনও মামলা রয়েছে যেখানে এটি ব্যবহার করা ভাল uintবা short/Int16যদি তাই হয় তবে সেগুলি কোনটি?


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


1
আমি মনে করি, সংক্ষিপ্ত উত্তরটি হ'ল প্রোগ্রামাররা স্বাক্ষরিত শব্দার্থবিদ্যায় অভ্যস্ত হয়ে পড়েছে এবং স্বাক্ষরবিহীন প্রকারের (এবং এইভাবে স্বাক্ষরবিহীন শব্দার্থবিজ্ঞানের) সাথে व्यवहार করার পরেও সেগুলি ধরে নিতে প্রবণতা পোষণ করে। বেশিরভাগ লোকেরা ধারণা করেন যে এটি প্রোগ্রামারটি অলস বা অশিক্ষিত হওয়ার বিষয়, তবে প্রশ্নযুক্ত প্রোগ্রামারটি আসলে খুব শিক্ষিত এবং খুব সতর্ক হতে পারে এবং সূক্ষ্ম সমস্যাগুলি এড়াতে চায়। যদি আপনি চান, কটাক্ষপাত করা soundsoftware.ac.uk/c-pitfall-unsigned এবং anteru.net/2010/05/17/736
থিওডোরোস চ্যাটজিগিয়ানানাকিস

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

1
আমার অভিজ্ঞতায় অনেক প্রোগ্রামার, যারা কখনও সি ভাষায় প্রোগ্রাম করেছেন, তাদের আজকাল জিবি মেমরি এবং স্টোরেজ স্পেসের বাইটগুলি যত্ন নেওয়ার প্রবণতা রয়েছে।
user1451111

উত্তর:


25

আমি সন্দেহ করি যে আপনি নিজের অভিজ্ঞতার দ্বারা বর্ণিত এমন একটি দৃষ্টিভঙ্গির কথা উল্লেখ করছেন যেখানে আপনি ভাবাপন্নদের কাছ থেকে কাজ করেন নি যারা অবিচ্ছেদ্য ধরণের সঠিকভাবে ব্যবহার করেন। এটি খুব সাধারণ ঘটনা হতে পারে তবে আমার অভিজ্ঞতা হয়েছে যে লোকেরা সাধারণত তাদের সঠিকভাবে ব্যবহার করে।

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

সঠিক ব্যবহার হিসাবে আপনি আশা করবে হয় - যে কোন সময় আপনি জানেন নির্দিষ্ট জন্য আপনি তাদের ব্যবহার করতে পারেন স্থায়ীভাবে (নিশ্চিতভাবে ছাড়া সীমাবদ্ধ নেই অথবা হবে এটা পরে দু: খ প্রকাশ)।

  • আপনি যদি এমন কিছু উপস্থাপন করার চেষ্টা করছেন যা কখনই যুক্তিসঙ্গতভাবে নেতিবাচক হতে পারে না ( public uint NumberOfPeople) স্বাক্ষরবিহীন প্রকারটি ব্যবহার করুন।
  • যদি আপনি এমন কোনও উপস্থাপনা করার চেষ্টা করছেন যা কখনই যুক্তিসঙ্গতভাবে 255 ( public byte DamagedToothCount) এর চেয়ে বেশি হতে না পারে তবে বাইট ব্যবহার করুন।
  • যদি আপনি এমন কোনও কিছু উপস্থাপন করার চেষ্টা করছেন যা যথাযথভাবে 255 এর চেয়ে বেশি হতে পারে তবে হাজারের উল্লেখযোগ্য সংখ্যক কখনও না , একটি সংক্ষিপ্ত ব্যবহার করুন ( public short JimmyHoffasBankBalance)।
  • যদি আপনি এমন এমন কিছু উপস্থাপন করার চেষ্টা করছেন যা কয়েক লক্ষ, লক্ষ লক্ষও হতে পারে তবে একাধিক বিলিয়নে পৌঁছানোর সম্ভাবনা কম থাকে তবে একটি int ( public int HoursSinceUnixEpoch) ব্যবহার করুন ।
  • আপনি যদি নিশ্চিতভাবে জানেন যে এই সংখ্যার সীমাহীন বড় মূল্য থাকতে পারে বা আপনি মনে করেন এটির একাধিক বিলিয়ন থাকতে পারে তবে আপনি নিশ্চিত নন কত বিলিয়ন, আপনার সেরা বাজি কত দীর্ঘ। যদি দীর্ঘ পরিমাণে বড় না হয় তবে আপনার একটি আকর্ষণীয় সমস্যা রয়েছে এবং নির্বিচারে নির্ভুলতার সংখ্যাসমূহ ( public long MyReallyGreatAppsUserCountThisIsNotWishfulThinkingAtAll) দেখতে শুরু করা দরকার ।

এই যুক্তিটি স্বাক্ষরিত, স্বাক্ষরবিহীন এবং বিভিন্ন ধরণের এট আল এর মধ্যে নির্বাচন করার জন্য ব্যবহার করা যেতে পারে, কেবলমাত্র আপনি যে ডেটা বাস্তবে প্রতিনিধিত্ব করছেন তার লজিকাল সত্য সম্পর্কে চিন্তা করুন।


11
+1, যদিও আমাকে এটি পরিষ্কার করতে হবে যে ফোন "নম্বরগুলি" সংখ্যা নয় বরং অঙ্কগুলির স্ট্রিং এবং optionচ্ছিকভাবে বিন্যাসকরণ। আপনি এটি সম্পর্কে সচেতন বলে মনে হয়, তবে আমরা কোনও খারাপ উদাহরণ স্থাপন করতে চাই না, এখন আমরা কি করব? এছাড়াও, নির্বিচারে কিছু মানের সীমাবদ্ধতা হ্রাস করা একটি স্বল্পদৃষ্টির এন্টিপ্যাটার্ন - যেখানেই intআপনি সমস্যা ডোমেনের মূল্যটি সীমাবদ্ধ করে দেয় এমন কোনও বিষয় জানতে না পারলে - কোনও ব্যাংক অ্যাকাউন্টগুলি 33 কে কুইডে হার্ড-সীমাবদ্ধ করতে চাইবে না (এবং মজার কথা ভাবুন) যখন ওভারফ্লো হয়…!)।
আমন

3
নতুন জীবন লক্ষ্য: আমার ব্যাংক অ্যাকাউন্টের অবিচ্ছেদ্য প্রকারের বহনযোগ্য বিশাল আকারের খসড়া।
recursion.ninja

11
নির্দিষ্ট জায়গায় স্বাক্ষরযুক্ত প্রকারগুলি না ব্যবহার করার ভাল কারণ রয়েছে, উদাহরণস্বরূপ, যখন স্বাক্ষরিত এবং স্বাক্ষরিতদের মধ্যে পাটিগণিত মিশ্রিত হয়। স্বাক্ষরবিহীন ints সম্পর্কিত সেরা অনুশীলনগুলি কি দেখুন ?

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

4
"সুবিধা হ'ল মেমরি স্পেস এবং সিপিইউ সময়" ... আমি এমন কোনও ঘটনা দেখছি না যেখানে ক্ষুদ্র প্রকারগুলি আসলে সিপিইউর সময় সাশ্রয় করে। পূর্ণসংখ্যা ক্রিয়াকলাপগুলি মেশিন-আকারের ধরণের তুলনায় কখনই দ্রুত হয় না, যেমন সিপিইউ সম্পর্কিত আপনি সম্ভবত ব্যবহার করতে পারেন long। মেমোরি সেভিং অবশ্যই ক্যাশে-লাইন দক্ষতা এবং আরও উন্নত করে অপ্রত্যক্ষভাবে সময় সাশ্রয় করতে পারে তবে ছোট প্রকারের সাথে প্রান্তিককরণের সমস্যাগুলি অপ্রত্যক্ষভাবে সময় ব্যয় করতে পারে।
বাম দিকের বাইরে

16

নিশ্চিত, সেখানে মামলা যেখানে এটি ব্যবহার করতে ভালো uintবা shortবা Int16। যখন আপনি জানেন যে আপনার ডেটা পরিসীমা সেই পরিবর্তনশীল ধরণের সীমাবদ্ধতার মধ্যে ফিট হয়ে যাবে, তখন এই ধরণেরটি ব্যবহার করা ঠিক আছে।

স্মৃতিশক্তি বাধা পরিবেশে বা বড় পরিমাণে বস্তুগুলির সাথে লেনদেন করার সময়, এটি ক্ষুদ্রতম আকারের ভেরিয়েবলটি ব্যবহার করে বোঝাতে পারে। উদাহরণস্বরূপ, ints বনাম shortএর মিলিয়ন উপাদান অ্যারের জন্য আকারের মধ্যে একটি উল্লেখযোগ্য পার্থক্য রয়েছে ।

প্রায়শই, নিম্নলিখিত এক বা একাধিক কারণে প্রকৃত কোডে এটি ঘটে না:

  • তথ্য সীমাবদ্ধতা সময়ের আগে জানা ছিল না
  • এমন একটি সুযোগ ছিল যে ডেটা সীমাবদ্ধতাগুলি শক্ত ছিল না বা সম্ভবত এটির পরিবর্তিত হবে বলে জানা ছিল
  • বিস্তৃত ডেটা ব্যাপ্তির সাথে ফাংশনটি পুনরায় ব্যবহারের আশা ছিল
  • বিকাশকারীরা সীমাবদ্ধতার মধ্যে দিয়ে চিন্তা করতে সময় নেয়নি
  • একটি ছোট ভেরিয়েবল টাইপ ব্যবহার করে ন্যায়সঙ্গত করার জন্য মেমোরি সঞ্চয়গুলি তুচ্ছ ছিল

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


8

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

Int32কমপ্যাক্ট স্টোরেজ বা পরিবহণের জন্য জিনিসগুলি প্যাকিং বা আনপ্যাকিং করা প্রয়োজন হলে কেবলমাত্র কোনও সময়ের চেয়ে কম কোনও ডাটা টাইপ ব্যবহার করা সার্থক । যদি কারও অর্ধ বিলিয়ন পজিটিভ সংখ্যা সঞ্চয় করতে হয় এবং তারা সবাই 0 থেকে 100 এর মধ্যে থাকবে, চারটির পরিবর্তে প্রতিটি বাইট ব্যবহার করলে 1.5 গিগাবাইট স্টোরেজ সাশ্রয় হবে। এটি একটি বড় সঞ্চয়। যদি কোনও কোডের টুকরোতে মোট কয়েকটি দম্পতিতে কয়েকশ মান সংরক্ষণ করতে হয় তবে তাদের প্রত্যেককে চারটির চেয়ে এক বাইট তৈরি করে প্রায় 600 বাইট সংরক্ষণ করা যায়। সম্ভবত বিরক্ত করার মতো নয়।

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


4

স্বাক্ষরবিহীন প্রকারগুলি ব্যবহার করা সাধারণত একটি খারাপ ধারণা কারণ এগুলি অপ্রীতিকর উপায়ে উপচে পড়ে। x = 5-6হঠাৎ আপনার কোডের একটি টাইমবম্ব। ইতিমধ্যে স্বাক্ষরযুক্ত প্রকারের সুবিধাগুলি একক অতিরিক্ত বিট স্পষ্টতা অবধি সিদ্ধ হয় এবং যদি সেই বিটটি আপনার পক্ষে উপযুক্ত হয় তবে আপনার পরিবর্তে প্রায় অবশ্যই বড় ধরনের ব্যবহার করা উচিত।

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


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

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

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

@ জ্যাকএইডলি আমি নিশ্চিত যে আপনি যা বলছেন তা কোনও অর্থহীন নয়, কারণ 5-6 একই বিট প্যাটার্ন ফলন করেছে, এটি স্বাক্ষরযুক্ত বা না থাকুক না কেন।
ইঙ্গো

@ ইঙ্গো: আপনি কতক্ষণ বিট নিদর্শনগুলিতে দেখেন? কোনটি গুরুত্বপূর্ণ তা বিট প্যাটার্নটির অর্থ যা কোন বিটগুলি চালু বা বন্ধ নয়।
জ্যাক এইডলি

2

.NET ধরণের সাথে বিশেষভাবে আচরণ করার সময় আপনার প্রশ্নের প্রায়শই ভুলে যাওয়া এবং সম্ভবত স্পর্শকাতর হ'ল সিএলএস সম্মতি । .NET ফ্রেমওয়ার্কে নির্মিত সমস্ত ভাষার জন্য সমস্ত ধরণের উপলভ্য নয়।

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

উদাহরণস্বরূপ, VB.NET (7.0 এবং 7.1) এর প্রাথমিক সংস্করণগুলি স্বাক্ষরবিহীন পূর্ণসংখ্যার ( UInteger) সমর্থন করে না :

http://msdn.microsoft.com/en-us/library/aa903459(v=vs.71).aspx

স্বাক্ষরবিহীন পূর্ণ সংখ্যাগুলি সিএলএসের অনুগত নয় এবং তাই আপনার শ্রেণীর পাঠাগার গ্রাহক কে হবেন তা নিশ্চিত না হলে যত্ন সহ ব্যবহার করা উচিত।

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