ডেটা টাইপ হিসাবে পূর্ণসংখ্যা কি খুব বেশি ব্যবহৃত হয়?


9

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

এর মতো কোড সম্পর্কে কিছুটা ভয়ঙ্কর মনে হচ্ছে

TStuffRec = record
   recordID : Integer;
   thingID : Integer;
   otherThingID : Integer;
end;

এটি হিসাবে লেখা যেতে পারে যখন

TStuffRec = record
   recordID : Cardinal;
   thingID : Cardinal;
   otherThingID : Cardinal;
end;

কার্যকরীভাবে, এই রেকর্ডগুলি প্রায় সবসময় একই কাজ করে (এবং আশা করি 64৪-বিট ডেলফিতেও একই কাজ চালিয়ে যাবে)। তবে খুব বড় সংখ্যার রূপান্তর সংক্রান্ত সমস্যা থাকবে।

কিন্তু স্বাক্ষরবিহীন ইনটগুলি ব্যবহার করার ক্ষেত্রেও ত্রুটি রয়েছে। মূলত এটি দুটি মিশ্রিত করা কতটা বিরক্তিকর থেকে শুরু করে ste

আসল প্রশ্নটি হল, এটি কি এমন একটি জিনিস যা বাস্তবে সম্পর্কে চিন্তাভাবনা করে বা সেরা অনুশীলনে অন্তর্ভুক্ত হয়? এটি কি কেবলমাত্র বিকাশকারীর হাতে থাকে?


5
পিটার, আপনি কি কেবল ডেলফি-নির্দিষ্ট উত্তরগুলি সন্ধান করছেন?
অ্যাডাম শিখুন

3
@ আন্না বুঝতে পেরেছেন যে ডেলিফি ডেটাটাইপস কীভাবে একটি সেরা উত্তরের জন্য কাজ করবে। আমি যুক্তিযুক্ত নিশ্চিত যে সি প্রোগ্রামাররা যদিও এই প্রশ্নের উত্তর বুঝতে পারে এবং উত্তর দিতে পারে।
পিটার টার্নার

উত্তর:


9

আমি ডেলফিতে স্বাক্ষরযুক্ত পূর্ণসংখ্যার প্রকারগুলি এত বেশি ব্যবহার না করার একটি কারণ হ'ল স্বাক্ষরিত পূর্ণসংখ্যার সাথে মিশ্রিত হলে তারা সমস্যা তৈরি করতে পারে। এই যে একবার আমাকে বিট:

for i := 0 to List.Count - 1 do
  //do something here

আমি iস্বাক্ষরবিহীন পূর্ণসংখ্যা হিসাবে ঘোষণা করেছিলাম , (সর্বোপরি, এটি 0 থেকে শুরু হওয়া একটি তালিকার একটি সূচক, এটি কখনই নেতিবাচক হতে হবে না, তাই না?), কিন্তু যখন List.Count0 ছিল, এটি প্রত্যাশার মতো লুপটি শর্ট সার্কিট করবে না কারণ 0 - 1সত্যিই উচ্চতর ধনাত্মক সংখ্যায় মূল্যায়ন করে। ওহো!

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


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

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

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

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

সম্ভবত আপনি ভুলে গেছেন, কিন্তু ওভারফ্লো চেকিং এবং সংকলক নির্দেশাবলী অবিশ্বাস্যর সাথে ডেলফির পুরানো সংস্করণগুলিতে বগি ছিল। ডিবাগারটি সরাসরি একটি over $ O -} / {$ O +} ব্লকের মাঝামাঝি থেকে প্রফুল্লতার সাথে উত্সাহিত করতে থামার পরে আমার চুল ছিঁড়ে দেওয়ার বিষয়টি আমি স্পষ্টভাবে মনে করতে পারি। কিছুক্ষণ পরে আমি আর এটি নিতে পারিনি এবং কেবল বিশ্বব্যাপী এটি অক্ষম করে দিয়েছি। আবার, হ্যাঁ, এটি এই বিষয়টিকে ধরে ফেলবে, তবে আমি এখনও মনে করি না এটির জন্য মিথ্যা ধনাত্মক সংখ্যাটি মূল্যবান। প্রত্যেকের নিজের কাছে অবশ্যই!
অ্যারোনআউট

3

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

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

  • Loops। এটি প্রায়শই আমি "i: = 0 থেকে গণনা -1" পর্যন্ত একটি লুপ লিখি, যদি "i" বাইট হয় এবং গণনা = 0 হয় তবে লুপ 0 থেকে 255 পর্যন্ত চলে। আমি এটি চাই না তা নয়।

  • Uniforming। মনে রাখা এবং "var i: পূর্ণসংখ্যা" প্রয়োগ করা আরও সহজ; প্রতিটি ক্ষেত্রে থামার চেয়ে "Hm .. এখানে আমরা 0..120 রেঞ্জের সাথে বাইট করছি .. বাইট .. না, অপেক্ষা করুন, অবিচ্ছিন্ন .. সংক্ষিপ্ত বিবরণ .. অপেক্ষা করুন .. যদি 128 হয় তবে কি হবে যথেষ্ট নয় .. আরগ! " বা "এটি কেন এই জায়গায় ছোটখাটো, সংক্ষিপ্ত নয়?"

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

  • -1। মানগুলি 0..n-1 সীমাতে থাকা অবস্থায়ও আমাকে প্রায়শই "কোনও মূল্য / অজানা / অজানা / খালি" মানটি সেট করতে হবে যা সাধারণ অনুশীলন -1 দ্বারা হয়।

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

পিএস আমি কখন অন্য ধরণের ব্যবহার করব?

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

1

সর্বোত্তম অনুশীলন হ'ল কোনও ডেটা টাইপ ব্যবহার করা যা ডেটা ব্যবহৃত হওয়ার জন্য প্রয়োজনীয়তার সাথে খাপ খায় (প্রত্যাশিত ডেটা)।

সি # উদাহরণ: আমার যদি কেবল 0 থেকে 255 সমর্থন করা প্রয়োজন তবে আমি বাইট ব্যবহার করব।

আমার যদি 1,000,000 নেতিবাচক এবং ধনাত্মক সমর্থন করা প্রয়োজন, তবে int।

4.2 বিলিয়ন এর চেয়ে বড়, তারপরে একটি দীর্ঘ ব্যবহার করুন।

সঠিক প্রকারটি চয়ন করে, প্রোগ্রামটি মেমরির সর্বোত্তম পরিমাণের পাশাপাশি বিভিন্ন ধরণের মেমরির বিভিন্ন পরিমাণ ব্যবহার করবে।

এখানে এমএসডিএন থেকে সি # ইন রেফারেন্স দেওয়া আছে।

int 
 -2,147,483,648 to 2,147,483,647
 Signed 32-bit integer

uint 
 0 to 4,294,967,295
 Unsigned 32-bit integer

long 
 -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
 Signed 64-bit integer

ulong 
 0 to 18,446,744,073,709,551,615
 Unsigned 64-bit integer

সি # তে (বা সাধারণভাবে নেট) 128-বিট মেশিনে দীর্ঘ এবং দীর্ঘ 128 বিট হয়ে যাবে? কারণ ডেলফিতে, Integerডেটাটাইপটি 32-বিট মেশিনে 32 বিট এবং স্পষ্টতই একটি 64-বিট মেশিনে 64 বিট হবে।
পিটার টার্নার 21

1
@ পিটার টার্নার: না, সি # তে কোডটি কী মেশিনে চলছে তা বিবেচনা intকরেই কেবল একটি শর্টহ্যান্ড hand System.Int32
নিকি

@ নিকি, এটি কি ঠিক এর মতো type int System.Int32বা সেই প্রভাবের মতো কিছু? ভবিষ্যতের কাঠামোর ভবিষ্যতের সংস্করণে কি সহজেই এটি পরিবর্তন করা যেতে পারে?
পিটার টার্নার 21

@ পিটার টার্নার / নিকি (মাপের (ইনট্রি)। টোস্ট্রিং ()); ==> 4 রিটার্ন (আকারের (আন্তঃ 64)। টুস্ট্রিং ()); ==> আমার 64 বিট উইন্ডোজ ওএসে 8 ফেরৎ দেয়। নিকি হিসাবে, পরিসংখ্যান, একটি int সত্যিই ন্যায়বিচার এবং int32।
জন রায়নর 21

1
একটি বিষয় এখানে লক্ষণীয় যে সমস্ত ধরণের কমন ল্যাঙ্গুয়েজ স্পেসিফিকেশনের সাথে সম্মতিযুক্ত নয়uintএই জাতীয় একটি অমীমাংসিত ধরণের যার অর্থ এটি লাইব্রেরিটিতে লেখা আছে এমনটি ছাড়া নেট নেট ভাষায় সেই এপিআই ব্যবহারের ক্ষমতা ভঙ্গ করতে এড়াতে সর্বজনীন উন্মুক্ত এপিআইতে ব্যবহার করা উচিত নয় This এটি কারণেই। নেট ফ্রেমওয়ার্ক API নিজেই ব্যবহার করবে intযেখানে uintকরবে।
অ্যাডাম লিয়ার

1

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

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

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

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