কেন জাভা স্বাক্ষরবিহীন ints সমর্থন করে না?


374

কেন জাভা স্বাক্ষরবিহীন পূর্ণসংখ্যার জন্য সমর্থন অন্তর্ভুক্ত করে না?

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

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

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

এগুলি অন্তর্ভুক্ত করার ক্ষতি কী?


137
আমি জানি না তবে এটি আমার মধ্য থেকে বেরিয়ে আসা জাহান্নামকে বিরক্ত করে; উদাহরণস্বরূপ এইভাবে নেটওয়ার্ক কোডটি লেখা অনেক কঠিন।
তামাস সিজনেজে

20
আমি চাই ভাষা / ডাটাবেস / ... বিশ্ব: সংখ্যা এবং স্ট্রিংয়ে মাত্র দুটি প্রকার ছিল :)
লিয়াও

5
নেটওয়ার্ক কোড লিখন মোটেও শক্ত নয়। বিটিডাব্লু ইনপুটস্ট্রিম.ড্রেড (), স্বাক্ষরবিহীন বাইট দেয়, উদাহরণস্বরূপ স্বাক্ষরিত একটি নয় তাই নেটওয়ার্ক উদাহরণটি একটি বিভ্রান্তি আইএমএইচও। এটি কেবল বিভ্রান্তিকর আপনিই মনে করছেন যে একটি স্বাক্ষরিত মানটি লেখার জন্য স্বাক্ষরবিহীন একটি লেখার চেয়ে আলাদা। যেমন আপনি যদি না জানেন তবে বাইট স্তরে কী ঘটছে don't
পিটার ল্যারি

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

8
আমার কাছে ইমেজগুলি byteসরাসরি 140ধূসর স্তর দিতে সক্ষম না হওয়ায় কোনও চিত্র প্রক্রিয়াকরণ করা আরও শক্ত হয়ে ওঠে -116যা আপনার & 0xffসঠিক মান পেতে হবে need
ম্যাথিউইউ

উত্তর:


193

এটি সরলতার বিষয়ে গোসলিং এবং অন্যদের সাথে একটি সাক্ষাত্কার থেকে এসেছে :

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


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

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

59
যদি জাভাতে স্বাক্ষরযুক্ত স্বাক্ষরগুলি প্রয়োজন হয় কারণ অ্যারে সূচকগুলি নেতিবাচক হতে পারে না, তবে এর জন্য সাবরেঞ্জগুলি (একটি লা পাস্কাল) প্রয়োজন কারণ অ্যারে সূচক অ্যারের আকারের চেয়ে বড় হতে পারে না।
ওয়েইন কনরাড

81
ঠিক আছে, তিনি স্বাক্ষরবিহীন প্রকার না রাখার সুবিধাগুলি কেবল বলেছেন। এখন অসুবিধাগুলি গণনা করা যাক ...
মোশে রেভাঃ

83
আমি ভাষার সরলতার চেয়ে কোড সরলতাকে পছন্দ করি। এজন্য আমি জাভা ঘৃণা করি।
পাইজুসন

50

লাইনের মধ্যে পড়ে, আমি মনে করি যুক্তিটি এমন কিছু ছিল:

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

বেশিরভাগ ক্ষেত্রে, আমি বলতে চাই এটি একটি যুক্তিসঙ্গত সিদ্ধান্ত ছিল। সম্ভবত:

  • বাইট স্বাক্ষরবিহীন তৈরি, বা কমপক্ষে স্বাক্ষরিত / স্বাক্ষরযুক্ত বিকল্পগুলি সরবরাহ করেছে, সম্ভবত বিভিন্ন নাম সহ, এই একটি ডেটা টাইপের জন্য (এটি স্বাক্ষরিত করা ধারাবাহিকতার পক্ষে ভাল তবে কখন আপনার কখন স্বাক্ষরিত বাইটের দরকার হয়?)
  • 'সংক্ষিপ্ত' দিয়ে শেষ হয়ে গেলেন (কখন আপনি 16-বিট স্বাক্ষরিত পাটিগণিত ব্যবহার করেছেন?)

তবুও, কিছুটা ধাক্কা দিয়ে, 32 বিট অবধি স্বাক্ষরিত মানগুলিতে অপারেশনগুলি খুব খারাপ নয়, এবং বেশিরভাগ লোককে স্বাক্ষরযুক্ত 64৪-বিট বিভাজন বা তুলনা করার দরকার নেই।


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

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

15
স্বাক্ষরবিহীন বাইটের জন্য কল করার জন্য, যখন ইমেজ প্রসেসিং করা হয়, বাইটসকে স্বাক্ষরবিহীন বলে ধরে নেওয়া (এটি যেমন হওয়া উচিত), আমাকে ঘন্টা ডিবাগ করতে ব্যয় করে made
হেলিন ওয়াং

7
আপনি কীভাবে প্রায়শই shortব্যবহৃত হয় তা অবাক করে দিয়েছিলেন - ডিফল্টেট / জিজিপ / স্ফীত অ্যালগরিদমগুলি 16 বিট হয় এবং তারা শর্টসের উপর প্রচুর নির্ভর করে ... বা কমপক্ষে short[][স্বীকৃত তারা দেশীয় - তবুও জাভা ইমপ্লান্ট অ্যালগোরিদমের ডেটা টেরাবাইট)। দ্বিতীয়টির ( short[]) এর উল্লেখযোগ্য সুবিধা রয়েছে int[]যেহেতু এটি দ্বিগুণ কম মেমরি এবং কম মেমরি = আরও ভাল ক্যাচিং বৈশিষ্ট্য গ্রহণ করে, আরও ভাল পারফরম্যান্স গ্রহণ করে।
বেটসেস

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

19

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

byte - 8-বিট স্বাক্ষরিত পূর্ণসংখ্যা

short - 16-বিট স্বাক্ষরিত পূর্ণসংখ্যা

int - 32-বিট স্বাক্ষরিত পূর্ণসংখ্যা

long - 64-বিট স্বাক্ষরিত পূর্ণসংখ্যা

char - 16-বিট অক্ষর (স্বাক্ষরযুক্ত স্বাক্ষর)

যদিও পাটিগণিত charসমর্থন করে না unsigned, এটি মূলত একটি unsignedপূর্ণসংখ্যা হিসাবে বিবেচনা করা যেতে পারে । আপনাকে স্পষ্টরূপে পাটিগণিতের ক্রিয়াকলাপগুলি আবার কাস্ট করতে হবে charতবে এটি আপনাকে unsignedসংখ্যা নির্দিষ্ট করার উপায় সরবরাহ করে ।

char a = 0;
char b = 6;
a += 1;
a = (char) (a * b);
a = (char) (a + b);
a = (char) (a - 16);
b = (char) (b % 3);
b = (char) (b / a);
//a = -1; // Generates complier error, must be cast to char
System.out.println(a); // Prints ? 
System.out.println((int) a); // Prints 65532
System.out.println((short) a); // Prints -4
short c = -4;
System.out.println((int) c); // Prints -4, notice the difference with char
a *= 2;
a -= 6;
a /= 3;
a %= 7;
a++;
a--;

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


সম্পাদন করা

জেডিকে 8 এর সাথে এখানে নতুন এপিআই রয়েছে Longএবং Integerযা স্বাক্ষরযুক্ত মান হিসাবে চিকিত্সা longএবং intমানগুলিতে সহায়তাকারী পদ্ধতি সরবরাহ করে ।

  • compareUnsigned
  • divideUnsigned
  • parseUnsignedInt
  • parseUnsignedLong
  • remainderUnsigned
  • toUnsignedLong
  • toUnsignedString

অতিরিক্তভাবে, পেয়ারা পূর্ণসংখ্যার ধরণের ক্ষেত্রে অনুরূপ কাজ করার জন্য বেশ কয়েকটি সহায়ক পদ্ধতি সরবরাহ করে যা পূর্ণসংখ্যার জন্য দেশীয় সমর্থনের অভাবের ব্যবধানটি বন্ধ করতে সহায়তা করে unsigned


2
তবে উদাহরণস্বরূপ, পাটিগণিত charসমর্থন করার জন্য খুব ছোট long

3
এটি

আশা করছি যে তারা বাইটের জন্য স্বাক্ষরযুক্ত মানগুলিকে সমর্থন করে। জিনিসগুলিকে আরও সহজ করে তোলে।
শে

15

জাভাতে স্বাক্ষরবিহীন প্রকারের प्रकार রয়েছে বা কমপক্ষে একটি: চর একটি স্বাক্ষরযুক্ত স্বল্প। সুতরাং গোসলিং যে অজুহাত ছুঁড়ে মারবে তা সত্যিই কেবল তার অজ্ঞতা কেন অন্য কোনও স্বাক্ষরবিহীন প্রকার নেই।

এছাড়াও সংক্ষিপ্ত প্রকার: মাল্টিমিডিয়া জন্য শর্টস সর্বদা ব্যবহৃত হয়। কারণটি হ'ল আপনি একক 32-বিট স্বাক্ষরযুক্ত লম্বায় 2 টি নমুনা ফিট করতে পারেন এবং অনেকগুলি ক্রিয়াকলাপ ভেক্টরাইজ করতে পারেন। 8-বিট ডেটা এবং স্বাক্ষরযুক্ত বাইট সহ একই জিনিস। আপনি ভেক্টরাইজিংয়ের জন্য একটি রেজিস্ট্রারে 4 বা 8 টি নমুনা ফিট করতে পারেন।


37
হ্যাঁ, আমি নিশ্চিত যে গোসলিং আপনার তুলনায় জাভা সম্পর্কে খুব অজ্ঞ is
জ্যাকবক্সার

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

2
charঅক্ষর ব্যতীত অন্য কোনও কিছুর জন্য এটি ব্যবহার করা খারাপ স্টাইল ।
তারাবলিউ

5
@ স্টারব্লু অবশ্যই এটি তবে ভাষাটির একটি সীমাবদ্ধতা অর্জনের জন্য এটি হ্যাক
বেসিক

14

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


12
স্বাক্ষরিত / স্বাক্ষরবিহীন মিশ্রণের ক্ষেত্রে: আপনার স্বাক্ষরবিহীন প্রকারের থাকতে পারে তবে মিক্সিংটিকে অস্বীকার করুন (বা স্পষ্ট বর্ণের প্রয়োজন)। তবুও, এটি প্রয়োজনীয় কিনা তা পরিষ্কার নয়।
sleske

2
সি ++ এ static_castসেগুলি মেশাতে আপনাকে প্রায় বেশি পরিমাণে ছিটিয়ে দিতে হবে। এটা সত্যিই অগোছালো।
রায়েডওয়াল্ড

4
8 ম বিটটি এখানে রয়েছে, এটি কেবল চিহ্ন হিসাবে নিজেকে আড়াল করার চেষ্টা করে।
তারকাব্লু

বিষয়গুলি কেবল 32 বিট বা আরও বড় ধরণের দ্বারা অগোছালো হয়ে যায়। আমি দেখি যে byteপাস্কলে যেমন ছিল জাভা তে স্বাক্ষর করা উচিত হয়নি ।
সুপারক্যাট

12
জাভাতে ইমেজ প্রসেসিংয়ের সাথে যখন সমস্যা হয় তখন আমাকে দেখতে আসুন, যেখানে আপনি বাইটগুলি স্বাক্ষরবিহীন হওয়ার প্রত্যাশা করছেন। তারপরে আপনি জানতে পারবেন যে & 0xFFপ্রতিটি বাইট-টু-ইন প্রচার প্রচার করা কোডটিকে আরও মেসের করে তোলে।
বিট

12

http://skeletoncoder.blogspot.com/2006/09/java-tutorials-why-no-unsigned.html

এই লোকটি বলেছেন কারণ সি স্ট্যান্ডার্ডটি স্বাক্ষরবিহীন এবং স্বাক্ষরিত ইনটগুলিকে স্বাক্ষরযুক্ত হিসাবে গণ্য করার জন্য জড়িত ক্রিয়াকলাপগুলি সংজ্ঞায়িত করে। এটি নেতিবাচক স্বাক্ষরিত পূর্ণসংখ্যার চারপাশে একটি বৃহত্তর স্বাক্ষরিত ইন্টের মধ্যে ঘুরতে পারে, সম্ভাব্যভাবে বাগ তৈরি করে।


34
জাভা স্বাক্ষরিত পূর্ণসংখ্যার চারপাশেও। আমি আপনার বক্তব্য দেখতে পাচ্ছি না।
ফু

8
@ ফু: স্বাক্ষরিত পূর্ণসংখ্যাগুলি সমস্যার কারণ হওয়ার আগে তাদের বড় হতে হবে। বিপরীতে, সি-তে, যে কোনও নেতিবাচক পূর্ণসংখ্যার - এমনকি -1- কোনও স্বাক্ষরবিহীন পরিমাণ - এমনকি শূন্যের সাথে তুলনা করতেও সমস্যা হতে পারে ।
সুপারক্যাট

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

4
আপনার উত্তরে গলাবাজি কিন্তু থাকার জন্য নয় -1(নিবন্ধ হিসাবে প্রস্তাব দেওয়া) "অজানা" বয়স হিসাবে এক "কোড গন্ধটি" ক্লাসিক উদাহরণ । উদাহরণস্বরূপ, আপনি যদি "এলবসের চেয়ে বব কত বয়সী?" এবং এ = 25 এবং বি = -1 গণনা করতে চান তবে আপনি একটি উত্তর পাবেন ±26যা কেবল ভুল। অজানা মানগুলির সঠিক পরিচালনা হ'ল এক প্রকার যা Option<TArg>কখন Some(25) - Noneফিরে আসবে None
বাইটবেস্টার

11

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

ব্যবহারিক পরামর্শ হিসাবে:

  • যদি আপনার মানগুলি কিছুটা স্বেচ্ছাচারিত আকারের হয় এবং এতে ফিট না হয় তবে intব্যবহার করুন long। যদি তারা longব্যবহারের উপযুক্ত না হয় BigInteger

  • আপনার স্থান সংরক্ষণের প্রয়োজন হলে কেবল ছোট ধরণের অ্যারে ব্যবহার করুন।

  • আপনার যদি ঠিক 64/32/16/8 বিট প্রয়োজন হয়, বিভাগ long/ তুলনা, ডান শিফট এবং ingালাই বাদ দিয়ে সাইন বিটটি সম্পর্কে / int/ short/ ব্যবহার করুন byteএবং উদ্বেগ বন্ধ করুন।

"সি থেকে জাভাতে এলোমেলো নম্বর জেনারেটর পোর্টিং" সম্পর্কে এই উত্তরটিও দেখুন ।


5
হ্যাঁ, ডান নাড়াচাড়া করার জন্য আপনাকে মধ্যে নির্বাচন করতে হবে >>এবং >>>স্বাক্ষর স্বাক্ষরবিহীন যথাক্রমে জন্য। বাম দিকে স্থানান্তর কোনও সমস্যা নেই is
তারাবল ব্লু

1
@starblue আসলে এবং এর >>>জন্য কাজ করে না । উদাহরণস্বরূপ, তুলনায় ফলন । আর একটি উদাহরণ: ফলাফল হবে । অবশ্যই আপনি করতে পারেন তবে এটি আরও একটি অপারেশন যুক্ত করে (বিটওয়াইস এবং)। shortbyte(byte)0xff>>>10x7fffffff0x7fbyte b=(byte)0xff; b>>>=1;b==(byte)0xffb=(byte)(b & 0xff >> 1);
সিআইটিবিএল

7
"... এমনকি সরলীকৃত মডেলের সাথেও বেশিরভাগ জাভা প্রোগ্রামাররা জানেন না যে মৌলিক সংখ্যাসূচক প্রকারগুলি কীভাবে আচরণ করে ..." আমার মধ্যে কিছু কেবলমাত্র একটি ভাষা পুনরায় সেট করে যা সর্বনিম্ন সাধারণ ডিনোমিনেটরকে লক্ষ্য করে।
বেসিক

আপনার উত্তরের প্রারম্ভিক রেখাটি, আরও জটিলতা এবং সামান্য লাভ সম্পর্কে 6 বছর পরে আমি আমার নিবন্ধে যথাযথভাবে যা ব্যাখ্যা করেছি তা হল: nayuki.io/page/unsigned-int-considered-harmful-
for-

1
@ নয়ুকি আপনার নিবন্ধটি সত্যিই দুর্দান্ত। কেবলমাত্র একটি ছোট মন্তব্য, আমি এক্সআর এর পরিবর্তে তুলনামূলক অপারেটরদের জন্য 0x80000000 এর সংযোজনটি ব্যবহার করব, কারণ এটি ব্যাখ্যা করে কেন এটি কাজ করে, এটি সেই মিলিত অঞ্চলটিকে স্থানান্তরিত করে যেখানে তুলনাটি -ম্যাক্সিন্ট থেকে 0. পর্যন্ত স্থানান্তরিত হয়। তবুও এর প্রভাবটি একই রকম।
স্টার ব্লু

6

জেডিকে 8 এর সাথে তাদের কিছুটা সমর্থন রয়েছে।

গোসলিংয়ের উদ্বেগ সত্ত্বেও আমরা জাভাতে স্বাক্ষরযুক্ত প্রকারের সম্পূর্ণ সমর্থন দেখতে পাচ্ছি।


12
ওরফে "সুতরাং লোকেরা সত্যই এটি ব্যবহার করে এবং আমরা এটি দিয়ে শুরু না করাই ভুল ছিল" - তবে আমরা এখনও জাভা ডেভসকে ভেরিয়েবল স্বাক্ষরিত কিনা তা জানতে যথেষ্ট বিশ্বাস করি না - সুতরাং আমরা সেগুলি বাস্তবায়ন করব না ভিএম বা তাদের স্বাক্ষরিত চাচাত ভাইদের সমতুল্য প্রকার হিসাবে।
বেসিক

6

আমি জানি এই পোস্টটি অনেক পুরানো; তবে আপনার আগ্রহের জন্য, জাভা 8 এবং তারপরে, আপনি intএকটি স্বাক্ষরবিহীন 32-বিট পূর্ণসংখ্যা উপস্থাপন করতে ডেটা টাইপ ব্যবহার করতে পারেন , যার সর্বনিম্ন মান 0 এবং সর্বাধিক 2 32 −1 এর মান রয়েছে । স্বাক্ষরবিহীন পূর্ণসংখ্যার হিসাবে স্ট্যাটাস পদ্ধতি এবং ইত্যাদির মতো ডেটা টাইপ ব্যবহার করতে Integerক্লাসটি ব্যবহার intকরুন compareUnsigned(), স্বাক্ষরবিহীন পূর্ণসংখ্যার জন্য পাটিগণিত ক্রিয়াকলাপ সমর্থন divideUnsigned()করার জন্য Integerক্লাসে যুক্ত করা হয়েছে ।


4

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


এটি ঠিক আছে ... গোসলিংয়ের সাক্ষাত্কারের প্রমাণ ব্যতীত স্বাক্ষরিত সাক্ষাত্কারগুলি (বাদে char) বাদ দেওয়া হয়েছিল কারণ ডিজাইনাররা ভাবেন যে তারা একটি খারাপ ধারণা ... ভাষাটির লক্ষ্য বিবেচনা করে।
স্টিফেন সি

যদি ডকুমেন্টারি প্রমাণও হাতে থাকে, তবে প্রত্যক্ষদর্শীদের বিবৃতিতে কখনই খুব বেশি মূল্য দেওয়া উচিত নয় এটি একটি ভাল ধারণা।
ব্যবহারকারী 7610

4

আমি একবার সি ++ স্ট্যান্ডার্ড কমিটির কারও সাথে সি ++ কোর্স করেছিলাম যিনি ইঙ্গিত করেছিলেন যে জাভা স্বাক্ষরযুক্ত পূর্ণসংখ্যা না এড়াতে সঠিক সিদ্ধান্ত নিয়েছে কারণ (১) সাইন ইন ইন্টিজার ব্যবহার করা বেশিরভাগ প্রোগ্রাম স্বাক্ষরিত পূর্ণসংখ্যার সাথেও করতে পারে এবং এটি আরও স্বাভাবিক লোকেরা কীভাবে চিন্তা করে, এবং (২) স্বাক্ষরবিহীন পূর্ণসংখ্যার ব্যবহারের ফলে ফলাফল তৈরির পক্ষে অনেক সহজ তবে সংখ্যার পাটিগণিত ওভারফ্লো এবং স্বাক্ষরিত এবং স্বাক্ষরযুক্ত প্রকারের মধ্যে রূপান্তর করার সময় গুরুত্বপূর্ণ বিটগুলি হারাতে সমস্যা সমাধানের পক্ষে জটিল। আপনি যদি ভুলভাবে সাইন ইনডিজারগুলি ব্যবহার করে 0 থেকে 1 বিয়োগ করে থাকেন তবে এটি আপনার প্রোগ্রামটি প্রায়শই দ্রুত ক্র্যাশ হয়ে যায় এবং এটি বাগের চেয়ে 2 ^ 32 - 1 এর মধ্যে গুটিয়ে যায় এবং কম্পাইলার এবং স্ট্যাটিক বিশ্লেষণ সরঞ্জাম এবং রানটাইম চেক করতে হয় ধরুন আপনি যখনই স্বাক্ষরবিহীন গাণিতিক ব্যবহার করা বেছে নিয়েছেন তখন আপনি কী জানেন know এছাড়াও,

অনেক আগে, যখন মেমরি সীমাবদ্ধ ছিল এবং প্রসেসরগুলি স্বয়ংক্রিয়ভাবে একবারে b৪ বিটগুলিতে অপারেশন করে না, প্রতিটি বিট আরও অনেক বেশি গণনা করা হত, সুতরাং স্বাক্ষরযুক্ত স্বাক্ষরযুক্ত বাইটস বা শর্টস সাইন ইন করা আসলে অনেক বেশি ক্ষেত্রে গুরুত্বপূর্ণ ছিল এবং স্পষ্টতই সঠিক নকশার সিদ্ধান্ত ছিল। আজ প্রায় সমস্ত নিয়মিত প্রোগ্রামিং ক্ষেত্রে সাইন ইনট ব্যবহার করা পর্যাপ্ত পরিমাণের চেয়ে বেশি এবং আপনার প্রোগ্রামটি যদি সত্যিই 2 ^ 31 - 1 এর চেয়ে বড় মানগুলি ব্যবহার করার প্রয়োজন হয় তবে আপনি প্রায়শই কেবল দীর্ঘতর চান। একবার আপনি দীর্ঘায়ু ব্যবহারের অঞ্চলে প্রবেশ করার পরে, 2 ^ 63 - 1 ধনাত্মক পূর্ণসংখ্যার সাথে কেন আপনি সত্যিকার অর্থে পারছেন না এমন কোনও কারণ উপস্থিত করা আরও কঠিন। যখনই আমরা 128 বিট প্রসেসরের কাছে যাই এটি কোনও সমস্যার থেকেও কম হবে less


2

আপনার প্রশ্ন "জাভা স্বাক্ষরবিহীন ইনটগুলি সমর্থন করে না কেন"?

: এবং আপনার প্রশ্নের আমার উত্তর জাভা চায় যে এটা সব আদিম ধরনের হয় বাইট , গৃহস্থালির কাজ , ছোট , int- এ এবং দীর্ঘ হিসাবে ধরা হবে, বাইট , শব্দ , DWORD এবং qword যথাক্রমে ঠিক সমাবেশ মত, এবং জাভা অপারেটার হয় স্বাক্ষরিত এটা সব অপারেশন ছাড়া আদিম ধরনের এর গৃহস্থালির কাজ , কিন্তু শুধুমাত্র উপর গৃহস্থালির কাজ তারা শুধুমাত্র 16 বিট স্বাক্ষরবিহীন হয়।

তাই স্ট্যাটিক পদ্ধতি হতে অনুমান স্বাক্ষরবিহীন অপারেশন এছাড়াও 32 এবং 64 বিটের উভয়ের জন্যই ।

আপনার চূড়ান্ত শ্রেণি প্রয়োজন, যার স্থির পদ্ধতি স্বাক্ষরবিহীনদের জন্য কল করা যেতে পারে ক্রিয়াকলাপগুলির ।

আপনি এই চূড়ান্ত শ্রেণিটি তৈরি করতে পারেন, আপনি যে নামেই চান তা কল করুন এবং এটি স্থির পদ্ধতিগুলি প্রয়োগ করতে পারেন।

স্থিতিশীল পদ্ধতিগুলি কীভাবে প্রয়োগ করা যায় সে সম্পর্কে আপনার যদি ধারণা নেই তবে এই লিঙ্কটি আপনাকে সহায়তা করতে পারে।

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

এটি উপায় দ্বারা ভাষা নামে সম্পূর্ণ আলাদা।

সুতরাং আমি জাভাতে সি এর মতো কোড টাইপ করার পরামর্শ দিচ্ছি না এবং আমি মোটেও সি ++ এর মতো কোড টাইপ করার পরামর্শ দিচ্ছি না, কারণ তখন জাভাতে আপনি সি ++ এ পরবর্তী কাজটি করতে সক্ষম হবেন না, অর্থাত্ কোডটি মোটেও সি ++ অবিরত থাকবে না এবং আমার পক্ষে এটির মতো কোডের পক্ষে মাঝখানে শৈলীর পরিবর্তন করা খারাপ।

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

এছাড়াও আমি ব্যবহার এড়াতে সুপারিশ সংক্ষিপ্ত , int- এ এবং দীর্ঘ আদিম ধরনের, এবং ব্যবহার শব্দ , DWORD এবং qword পরিবর্তে যথাক্রমে, এবং আপনি যদি এর পরিবর্তে স্বাক্ষরবিহীন অপারেশনের জন্য স্ট্যাটিক পদ্ধতি কল সম্পর্কে এবং / অথবা স্বাক্ষরিত অপারেশন অপারেটর ব্যবহারের।

আপনি শুধুমাত্র স্বাক্ষরিত অপারেশন এবং শুধুমাত্র কোডে অপারেটর ব্যাবহার চলেছেন, তাহলে এই এই আদিম ধরনের ব্যবহার করতে ঠিক আছে ছোট , int- এ এবং দীর্ঘ

বাস্তবিক শব্দ , DWORD এবং qword না না ভাষায় বিদ্যমান, কিন্তু আপনি প্রতিটি নতুন শ্রেণী তৈরি করতে পারেন এবং প্রতিটি বাস্তবায়ন খুব সহজ হওয়া উচিত:

বর্গ শব্দ আদিম টাইপ ঝুলিতে সংক্ষিপ্ত শুধুমাত্র, বর্গ DWORD আদিম টাইপ ঝুলিতে int- এ শুধুমাত্র এবং ক্লাস qword আদিম টাইপ ঝুলিতে দীর্ঘ শুধুমাত্র। সমস্ত স্বাক্ষরবিহীন এবং স্বাক্ষরিত পদ্ধতিগুলি স্থিতিশীল হিসাবে বা আপনার পছন্দ হিসাবে নয়, আপনি প্রতিটি শ্রেণিতে প্রয়োগ করতে পারবেন, অর্থাত্ 16 টি বিট অপারেশন উভয় স্বাক্ষরযুক্ত এবং স্বাক্ষরিত শব্দ শব্দের অর্থের নাম দিয়ে , সমস্ত 32 বিট অপারেশন উভয়ই স্বাক্ষরবিহীন এবং উপর অর্থ নাম দিয়ে সাইন ইন DWORD বর্গ এবং সমস্ত 64 বিট অপারেশন উভয় স্বাক্ষরবিহীন এবং এর অর্থ নাম দিয়ে সাইন ইন qword বর্গ।

আপনি যদি প্রতিটি পদ্ধতির জন্য খুব বেশি আলাদা নাম দেওয়া পছন্দ করেন না, আপনি জাভাতে সর্বদা ওভারলোডিং ব্যবহার করতে পারেন, এটি পড়তে ভাল যে জাভাও তা মুছে ফেলেনি!

আপনি যদি 8 বিট স্বাক্ষরিত অপারেশনগুলির পরিবর্তে অপারেটর এবং 8 বিট স্বাক্ষরযুক্ত অপারেশনগুলির পদ্ধতিগুলি চান যা কোনও অপারেটর নেই, তবে আপনি বাইট শ্রেণি তৈরি করতে পারেন (নোট করুন যে প্রথম অক্ষর 'বি' মূলধন, সুতরাং এটি নয়) আদিম টাইপ বাইট ) এবং এই ক্লাসে পদ্ধতিগুলি বাস্তবায়ন করুন।

মান দ্বারা পাস এবং রেফারেন্স দ্বারা পাস সম্পর্কে:

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

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

আউটপুট সম্পর্কে:

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

নোট করুন যে সি প্রিন্টফ ফাংশনে প্যারামিটার হিসাবে ভেরিয়েবলের ধরণটি জানেন না, তাই প্রিন্টফ কেবল ফাংশনের প্রথম প্যারামিটারে গৃহীত চর * অবজেক্ট থেকে প্রতিটি ভেরিয়েবলের প্রকার জানেন।

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

দুর্ভাগ্যক্রমে আমি আপনাকে যে লিঙ্কটি দিয়েছি তা এই মুদ্রণ পদ্ধতিগুলি কীভাবে প্রয়োগ করা যায় তা প্রদর্শন করে না, তবে আমি নিশ্চিত যে এই প্রিন্ট পদ্ধতিগুলি প্রয়োগ করার জন্য আপনার প্রয়োজনীয় অ্যালগরিদমের জন্য আপনি গুগল করতে পারেন।

এটাই আমি আপনার প্রশ্নের উত্তর দিতে এবং আপনাকে পরামর্শ দিতে পারি।


এমএএসএম (মাইক্রোসফ্ট এসেম্বলার) এবং উইন্ডোজ বিওয়াইটিই, ওয়ার্ড, ডিডাবর্ড, কিউডাব্লর্ডকে স্বাক্ষরবিহীন প্রকার হিসাবে সংজ্ঞায়িত করে। এমএএসএমের জন্য, এসবিওয়াইটিই, এসডাব্লর্ড, এসডাব্লর্ড, এসকিউওয়ার্ড হ'ল স্বাক্ষরিত প্রকারগুলি।
rcgldr

1

কারণ unsignedটাইপ খাঁটি মন্দ।

সিতে unsigned - intউত্পন্ন হওয়ার unsignedবিষয়টি আরও খারাপ।

এখানে সমস্যার এক স্ন্যাপশট যা আমাকে একাধিকবার জ্বালিয়ে দিয়েছে:

// We have odd positive number of rays, 
// consecutive ones at angle delta from each other.
assert( rays.size() > 0 && rays.size() % 2 == 1 );

// Get a set of ray at delta angle between them.
for( size_t n = 0; n < rays.size(); ++n )
{
    // Compute the angle between nth ray and the middle one.
    // The index of the middle one is (rays.size() - 1) / 2,
    // the rays are evenly spaced at angle delta, therefore
    // the magnitude of the angle between nth ray and the 
    // middle one is: 
    double angle = delta * fabs( n - (rays.size() - 1) / 2 ); 

    // Do something else ...
}

আপনি কি বাগটি লক্ষ্য করেছেন? আমি স্বীকার করি যে আমি এটি কেবলমাত্র ডিবাগারের সাথে পদক্ষেপ নেওয়ার পরে দেখেছি।

কারণ n স্বাক্ষরবিহীন ধরনের হয় size_tসমগ্র অভিব্যক্তি n - (rays.size() - 1) / 2মূল্যায়ণ যেমন unsigned। এই অভিব্যক্তিটি মাঝেরটি থেকে ত্রিশ রশ্মির স্বাক্ষরিত অবস্থান হিসাবে লক্ষ্য করা যায় n: বাম দিকের মাঝের দিক থেকে প্রথম রশ্মির অবস্থানটি -1 হবে, ডানদিকে প্রথম স্থানটির অবস্থান +1 হবে ইত্যাদি। অ্যাবস ভ্যালু নেওয়া এবং deltaকোণ দিয়ে গুণ করলে আমি কোণ nএবং মাঝের কোণটি পেতে চাই ।

দুর্ভাগ্যক্রমে আমার পক্ষে উপরোক্ত অভিব্যক্তিটিতে অশুচি স্বাক্ষরিত রয়েছে এবং পরিবর্তে, বলুন -1 এর মূল্যায়ন না করে এটি 2 ^ 32-1 এ মূল্যায়ন করেছে। পরবর্তীকালে doubleবাগটি সিল করার জন্য রূপান্তর ।

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


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

@ সুপের্যাট: যদি প্রতিটি অপারেশনে unsignedরূপান্তরিত হয় intতবে এর ব্যবহার কী unsigned? এটির থেকে কোনও কার্যকারিতা আলাদা নয় short। এবং যদি আপনি intকেবল মিশ্র ক্রিয়াকলাপগুলিতে রূপান্তর করেন যেমন, unsigned+intবা unsigned+float, তবে আপনার এখনও সমস্যা রয়েছে ((unsigned)25-(unsigned)30)*1.0 > 0যা unsignedসম্পর্কিত বাগের প্রধান কারণ ।
মাইকেল

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

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

2
এই কোডটিতে আমি দেখতে পাচ্ছি কেবলমাত্র খারাপ জিনিস n - (rays.size() - 1) / 2। আপনার সর্বদা বাইনারি অপারেটরগুলি বন্ধনী করা উচিত কারণ কোড পাঠকের কম্পিউটার প্রোগ্রামে ক্রিয়াকলাপের ক্রম সম্পর্কে কিছু অনুমান করার প্রয়োজন নেই। কেবলমাত্র আমরা প্রচলিতভাবে a + b c = a + (b c) বলার অর্থ এই নয় যে কোড পড়ার সময় আপনি এটি ধরে নিতে পারেন। তদুপরি, গণনাটি লুপের বাইরে সংজ্ঞায়িত করা উচিত যাতে লুপটি উপস্থিত না করে পরীক্ষা করা যায় be স্বাক্ষরবিহীন পূর্ণসংখ্যার সমস্যার চেয়ে আপনার প্রকারের লাইন আপ না করে তা নিশ্চিত করার ক্ষেত্রে এটি একটি ত্রুটি। সি তে আপনার ধরণের লাইন ঠিক আছে তা নিশ্চিত করা আপনার পক্ষে।
দিমিত্রি

0

'সি' স্পেসে কয়েকটি রত্ন রয়েছে যে ব্যবহারিক কারণে জাভা নামিয়েছে তবে ধীরে ধীরে বিকাশকারী চাহিদা (ক্লোজার ইত্যাদি) দিয়ে ফিরে আসছে।

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

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

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

// ...
// Housekeeping state variable
long entrycount;     // A sequence number
int cycle;           // Number of loops cycled
int size;            // Active size of the array because size<modulus during cycle 0
int modulus;         // Maximal size of the array

// Ring state variables
private int head;   // The 'head' of the Ring
private int tail;   // The ring iterator 'cursor'
// tail may get the current cursor position
// and head gets the old tail value
// there are other semantic variations possible

// The Array state variable
double [] darray;    // The array of doubles

// somewhere in constructor
public RingArray(int modulus) {
    super();
    this.modulus = modulus;
    tail =  head =  cycle = 0;
    darray = new double[modulus];
// ...
}
// ...
double getElementAt(int offset){
    return darray[(tail+modulus+offset%modulus)%modulus];
}
//  remember, the above is treating steady-state where size==modulus
// ...

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

এনবি: বহিরাগত% মডিউলগুলি বৈধ অনুরোধগুলিকে ডি-রেফারেন্স করে যেখানে অভ্যন্তরীণ% মডুলাস মুখোমুখি কুৎসা রক্ষার জন্য-মডুলাসের চেয়ে বেশি নেতিবাচক থেকে বের করে। এটি যদি কখনও জাভাতে উপস্থিত হত .. .. + 9 || 8 + .. + স্পেস, তাহলে সমস্যাটি প্রকৃতপক্ষে এমন একজন 'প্রোগ্রামার হয়ে উঠবে যিনি "নিজেকে ঘোরানো" ফল্ট "করতে পারেন না।

আমি নিশ্চিত যে উপরের ওয়ান-লাইনারের সাহায্যে তথাকথিত জাভা স্বাক্ষরযুক্ত 'ঘাটতি' তৈরি করা যেতে পারে।

পিএস: কেবলমাত্র উপরের রিংআরে গৃহস্থালি প্রসঙ্গে প্রসঙ্গটি দিতে, উপরোক্ত 'get' উপাদানটির সাথে মেলে একটি প্রার্থী এখানে 'সেট' অপারেশন:

void addElement(long entrycount,double value){ // to be called only by the keeper of entrycount
    this.entrycount= entrycount;
    cycle = (int)entrycount/modulus;
    if(cycle==0){                       // start-up is when the ring is being populated the first time around
        size = (int)entrycount;         // during start-up, size is less than modulus so use modulo size arithmetic
        tail = (int)entrycount%size;    //  during start-up
    }
    else {
        size = modulus;
        head = tail;
        tail = (int)entrycount%modulus; //  after start-up
    }
    darray[head] = value;               //  always overwrite old tail
}

-2

আমি একটি দুর্ভাগ্যজনক পার্শ্ব-প্রতিক্রিয়া সম্পর্কে ভাবতে পারি। জাভা এম্বেডেড ডাটাবেসগুলিতে, 32 বিবিডি আইডি ক্ষেত্রের সাথে আপনার থাকতে পারে এমন আইডির সংখ্যা 2 ^ 31 নয়, 2 ^ 32 (2 বিলিয়ন ডলার নয়, 4 বিলিয়ন ডলার)।


1
তিনি সম্ভবত অ্যারের কথা ভাবছেন এবং সূচক হিসাবে নেতিবাচক পূর্ণসংখ্যার ব্যবহার করতে সক্ষম হচ্ছেন না। সম্ভবত।
এসকে 9

2
ডাটাবেসে স্ব-বর্ধন ক্ষেত্রগুলি যখন ওভারফ্লো হয় তখন প্রায়শই তারা বাকী হয়ে যায়।
জোশুয়া

-8

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

অন্যথায় আপনি কোনও সি সি প্রোগ্রামিং শুরু করার প্রান্তে বেসিক / বাশ / জাভা প্রোগ্রামারের সাথে কথা বলছিলেন, কোনও সত্য জ্ঞান ছাড়াই এই ভাষায় বা আপনি নিজের মন থেকে কেবল কথা বলছেন। ;)

আপনি যখন ফাইল বা হার্ডওয়্যার থেকে ফর্ম্যাট নিয়ে প্রতিদিন প্রশ্ন করেন তখন আপনি প্রশ্ন করতে শুরু করেন, তারা কী ভাবছে।

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

ডিসি


34
কেবল কিক্সের জন্য, গুগল "স্ব ঘূর্ণন লুপ" শব্দবন্ধটি। স্পষ্টতই , ডেনিস কো বিশ্বের একমাত্র ব্যক্তি যিনি নিজেকে / নিজেকে প্রোগ্রামার হিসাবে ডাকা যোগ্য :-)
স্টিফেন সি

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