জাভাতে সত্য ফিরে পাওয়ার জন্য (i == -i && i! = 0) এর জন্য i এর মান


101

আমার নিম্নোক্ত ifশর্ত আছে।

if (i == -i && i != 0)

জাভাতে এই শর্তটির জন্য কোন মূল্য iফিরে আসবে true?

আমি জাভাতে দু'জনের পরিপূরক স্বরলিপি iবিবেচনা করার মতো কোনও মূল্য সম্পর্কে ভাবতে অক্ষম ।

আমিও এই শর্তটির (জাভার প্রসঙ্গে) যে উত্তর দিয়েছি তার বীজগণিত প্রমাণ পেতে পছন্দ করব?


2
(i! = নাল)
কেমন হবে

4
-0.0এটিও নোট করুন== 0
পিটার লরি

2
এটি লিখুনif(i && i == -i)
গ্রিজেশ চৌহান

10
@ গ্রিজেশচৌহান জাভায়? তুমি কি নিশ্চিত ?
সাগুরেটকে অস্বীকার করুন

3
@ শেয়ারে আমি গত চার বছরে অনেকবার সাক্ষাত্কারে জিজ্ঞাসা করেছি এবং খুব কম লোক ইঙ্গিত সহ সত্যই এটি পেয়েছে।
পিটার লরি

উত্তর:


126

intএটির জন্য এটি কাজ করে একমাত্র মান Integer.MIN_VALUE

এর কারণ দুটি সংখ্যার পরিপূরক উপায়টি ব্যবহার করে পূর্ণসংখ্যা অগ্রাহ্য হয় ।

ব্যবহার

System.out.println(Integer.toBinaryString(Integer.MIN_VALUE));

আপনি যদি দেখেন Integer.MIN_VALUEহয়

10000000000000000000000000000000

নেতিবাচক মান গ্রহণ করা প্রথমে অদলবদল করে 0এবং 1যা দেয়

01111111111111111111111111111111

এবং যোগ করে 1, যা দেয়

10000000000000000000000000000000

আমি যে লিঙ্কটি দিয়েছি তাতে আপনি দেখতে পাচ্ছেন, উইকিপিডিয়ায় সবচেয়ে নেতিবাচক সংখ্যাগুলির সাথে সমস্যাটির কথা উল্লেখ করা হয়েছে এবং এটির একমাত্র ব্যতিক্রম নির্দিষ্ট করে:

দুজনের পরিপূরকগুলির মধ্যে সবচেয়ে নেতিবাচক সংখ্যাটিকে কখনও কখনও "অদ্ভুত সংখ্যা" বলা হয় কারণ এটি একমাত্র ব্যতিক্রম।

অবশ্যই Long.Min_Valueযদি আপনি এটি একটি longভেরিয়েবলের মধ্যে সঞ্চয় করেন তবে আপনার কাছে একই ঘটনা রয়েছে ।

নোট করুন যে এটি কেবল জাভাতে অন্তর্নির্মিত বাইনারি স্টোরেজ সম্পর্কিত যে পছন্দগুলি করা হয়েছিল তার কারণে হয়েছে । অন্য একটি (খারাপ) সমাধান উদাহরণস্বরূপ, কেবলমাত্র সবচেয়ে গুরুত্বপূর্ণ বিটটি পরিবর্তন করে এবং অন্যান্য বিটগুলি অপরিবর্তিত রেখে অবহেলা করা হতে পারে, এটি MIN_VALUE এর সাথে এই সমস্যাটি এড়াতে পারত তবে 2 টি পৃথক 0মান এবং জটিল বাইনারি গাণিতিক তৈরি করত (আপনার কীভাবে হবে? উদাহরণস্বরূপ বর্ধিত?)।


2
এটি লক্ষণীয় যে প্রারম্ভিক বাইনারি কম্পিউটারগুলি আপনার শেষ অনুচ্ছেদে বর্ণিত পূর্ণসংখ্যার জন্য চিহ্ন এবং প্রস্থের বাস্তবায়ন ব্যবহার করেছিল; যেমন IEE754 ভাসমান পয়েন্ট সংখ্যা। en.wikedia.org/wiki/…
ড্যান ইজ ফিডলিং

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

2
এটি জাভা স্পেসে নথিভুক্ত করার মতো উল্লেখযোগ্য : "জাভা প্রোগ্রামিং ভাষাটি পূর্ণসংখ্যার জন্য দু'টির পরিপূরক প্রতিনিধিত্ব ব্যবহার করে, এবং দু'টির পরিপূরক মানগুলির পরিসীমা প্রতিসাম্য নয়, সুতরাং সর্বোচ্চ negativeণাত্মক আন্ত বা দীর্ঘ ফলাফলের অবহেলা একই সর্বাধিক ঋণাত্মক সংখ্যা."
4:56 এ চেস্টারব্র

25

আপনি যে মানটির সন্ধান করছেন তা হ'ল Integer.MIN_VALUE


আমিও এই শর্তটির (জাভা প্রসঙ্গে) যা উত্তর দিয়েছি তার বীজগণিত প্রমাণ পেতে পছন্দ করব?

স্ট্যাক এক্সচেঞ্জের জন্য এটি অফ-টপিক। তবে আপনি এটি জাভা সংখ্যার সংজ্ঞা ( জেএলএস ৪.২ ) থেকে শুরু করে করতে পারেন

"অবিচ্ছেদ্য প্রকারগুলি বাইট, শর্ট, ইনট এবং লম্বা, যার মানগুলি 8-বিট, 16-বিট, 32-বিট এবং 64-বিট স্বাক্ষরিত দুটি এর পরিপূরক পূর্ণসংখ্যার ..."

এবং

"অবিচ্ছেদ্য ধরণের মানগুলি নিম্নলিখিত রেঞ্জগুলিতে পূর্ণসংখ্যা হয় ... অন্তর্গত জন্য -2147483648 থেকে 2147483647 পর্যন্ত অন্তর্ভুক্ত"

এবং জাভা unary '-' অপারেটরের সংজ্ঞা ( JLS 15.15.4 ):

"পূর্ণসংখ্যার মানগুলির জন্য, অবহেলা শূন্য থেকে বিয়োগের সমান The একই সর্বাধিক নেতিবাচক সংখ্যা Over এই ক্ষেত্রে ওভারফ্লো ঘটে, তবে কোনও ব্যতিক্রম ছুঁড়ে দেওয়া হয় না all সমস্ত পূর্ণসংখ্যার মানগুলির জন্য x, -x সমান (~ x) +1 ""


3
লম্বা .MIN_VALUE পাশাপাশি।
জুভানিস

1
যা 100000 .., এবং আমি যদি এর প্রশংসা 2 পাই তবে এটি আবার 011111 ... + 1 = 100000 ... তবে আপনি কি এটি আপনার মাথার শীর্ষে জানেন বা আমরা কোনও যুক্তি প্রয়োগ করতে পারি?
সানি

1
যেহেতু আমি পড়েছি..জাবার ইনটি গণিতটি গাণিতিক Mod 2power32, তাই আমি ভাবছিলাম যে আমরা যদি এই মানটি কেবল 1 বা 2 লাইনে প্রমাণ করতে পারি..এর কোনও বড় প্রমাণ হলে .. তবে কোনও সমস্যা নেই।
সানি

2
@ সানি এটি প্রমাণ করা খুব কঠিন হতে পারে না। পূর্ণসংখ্যার ব্যাপ্তিতে, সমস্ত ধনাত্মক সংখ্যার একটি নেতিবাচক অংশ থাকে (তাই i != -i)। এটি পরিসীমাটিতে দুটি সংখ্যা ফেলেছে: 0এবং Integer.MIN_VALUE। কারণ i != 0আপনার যদি, শুধুমাত্র MIN_VALUEবাকি আছে।
ভিনসেন্ট ভ্যান ডের ওয়েইল

1
@ হিউস্টার - এই যুক্তি কাজ করে ... তবে এটি নির্ভর করে এমন একটি বা দুটি ধারণার উপর যা নির্ভর করে।
স্টিফেন সি

18

এখনও পর্যন্ত দেওয়া উত্তরের অতিরিক্ত ...

মোট চারটি মান আছে

int i = Integer.MIN_VALUE;
long i = Long.MIN_VALUE;
Integer i = Integer.valueOf(Integer.MIN_VALUE);
Long i = Long.valueOf(Long.MIN_VALUE);

মোড়কযুক্ত মানগুলি মোড়ানো না হয় তাই তারা এই অভিব্যক্তির জন্যও সত্য।

দ্রষ্টব্য: ম্যাথ.অবস নথি

পাবলিক স্ট্যাটিক ইনট অ্যাবস (ইন এ)

কোন মান মানের নিরঙ্কুশ মান প্রদান করে। যুক্তিটি নেতিবাচক না হলে যুক্তিটি ফিরে আসে। যুক্তিটি নেতিবাচক হলে, যুক্তির অবহেলা ফিরে আসে।

মনে রাখবেন যে আর্গুমেন্টটি যদি পূর্ণসংখ্যার মানের সমান হয় M MIN_VALUE, সর্বাধিক নেতিবাচক উপস্থাপনযোগ্য int মান, ফলাফলটি একই মান, যা negativeণাত্মক।

এবং

পাবলিক স্ট্যাটিক লম্বা অ্যাবস (দীর্ঘ ক)

দীর্ঘ মূল্যের পরম মান প্রদান করে। যুক্তিটি নেতিবাচক না হলে যুক্তিটি ফিরে আসে। যুক্তিটি নেতিবাচক হলে, যুক্তির অবহেলা ফিরে আসে।

নোট করুন যে আর্গুমেন্টটি যদি Long.MIN_VALUE এর মান সমান হয় তবে সবচেয়ে নেতিবাচক প্রতিনিধিত্বযোগ্য দীর্ঘ মান হয়, ফলাফলটি একই মান, যা negativeণাত্মক।

এটি অবাক করার মতো বিষয় যে ম্যাথ.এবস একটি নেতিবাচক সংখ্যাটি ফিরে আসতে পারে। এটি হয় কারণ একটি) এই ক্ষেত্রে -MIN_VALUE এর জন্য কোনও ইতিবাচক মান নেই খ) -গণনা সম্পাদনের ফলে একটি ওভারফ্লো হয়।

আগ্রহের বিষয়টি হ'ল বাইট কেন হয় না M MIN_VALUE, সংক্ষিপ্ত। MIN_VALUE এটি করবেন না। কারণ -এটিগুলির জন্য প্রকার পরিবর্তন করে intএবং এইভাবে কোনও ওভারফ্লো হয় না।

অক্ষর। MIN_VALUE এর সমস্যা নেই কারণ এটি 0

ভাসা ।MIN_VALUE এবং ডাবল M এগুলি শূন্যের চেয়ে ছোটতম প্রতিনিধিত্বযোগ্য মান। সুতরাং তাদের বৈধ নেতিবাচক মান রয়েছে যা তারা নিজেরাই নয়।


1
আমি বাইট.এম.এক.এল.এল.এল. ও অন্যান্য সম্ভাবনা সম্পর্কে ভাবছিলাম, আপনার উত্তরটি এটি সরবরাহ করেছিল। ধন্যবাদ
চেঞ্জিজ

14

অন্যরা যেমন উল্লেখ করেছে, এটি কেবলমাত্র দ্বারা পূরণ হয় Integer.MIN_VALUE। প্রমাণ হিসাবে, আমাকে বাইনারি বাদে অন্য ব্যাখ্যা বোঝার জন্য আরও সহজ প্রস্তাব দেওয়া যাক (যদিও এটি এখনও এটির মধ্যে রয়েছে)।

লক্ষ্য করুন Integer.MIN_VALUEসমান -2^31বা -2147483648এবং Integer.MAX_VALUEসমান 2^31-1বা 2147483647-Integer.MIN_VALUEহয় 2^31যা এখন একটি পূর্ণসংখ্যা জন্য অত্যন্ত বড় (যেহেতু হল অতীত, MAX_VALUE) এইভাবে একটি পূর্ণসংখ্যা ওভারফ্লো ঘটাচ্ছে, এটা তৈরীর Integer.MIN_VALUEআবার। এটি কেবলমাত্র পূর্ণসংখ্যা যা এটি থেকে MIN_VALUEকেবল 0 থেকে বাদে কোনও নেতিবাচক সমতুল্য নয় এমন একমাত্র সংখ্যা।


2
@ অডিস্ট্রয় আসলে আমি মার্কের কাছে কিছু ব্যাখ্যা খুঁজছিলাম, ইনট রেঞ্জে +2147483648 এর মতো কোনও সংখ্যা নেই, সুতরাং প্রথম সন্দেহভাজন 0 এর বাইরে অন্য সংখ্যাটি হওয়া উচিত - 2 ^ n থেকে 2 ^ n-1। সুতরাং -2 to n তে কোনও ধনাত্মক অংশ নেই। এটি কেবলমাত্র অন্য সম্ভাব্য ইনট মান।
সানি

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

1
অদ্ভুতভাবে জাভাতে যথেষ্ট, সংখ্যাটি 2147483648কেবলমাত্র একটি পরিস্থিতিতে সোর্স কোডে উপস্থিত হতে পারে: ইউনারি বিয়োগ অপারেটরের অপারেন্ড হিসাবে (জেএলএস 3.10.1)।
এরিক জাবলো

6

অঙ্কগুলি বীজগণিতের প্রমাণ, modulo 2^32পাটিগণিত ব্যবহার করে :

i == -i2 * i == 0( iউভয় পক্ষের যোগ করে) হিসাবে আবার লেখা যেতে পারে , বা i << 1 == 0

এই সমীকরণটির ফর্মের দুটি সমাধান রয়েছে i == 0 >> 1, যথা 0bএবং 10000000000000000000000000000000bহয় 0বা 1বামে স্থানান্তরিত দ্বারা প্রাপ্ত ।

সমাধান i == 0বাদ দেওয়া হচ্ছে, সমাধান এখনও আছে i == 100000000000000000000000000000000b


0

হতে পারে এটি খুব শিক্ষামূলক নয়, তবে আপনি এই কোডটি চালাতে পারেন এমন ভেবে পরিবর্তে:

    for (int i = Integer.MIN_VALUE; i <= Integer.MAX_VALUE; i++)
    {
        if (i == -i && i != 0)
        {
            System.out.println(i);
        }
    }

এটি প্রিন্ট করে দেখুন

-2147483648
-2147483648

অসীম :)


আপনি কীভাবে এটি অসীম অনুমান?
জেবেলটার

কারণ আমি <= পূর্ণসংখ্যা MA MAX_VALUE কখনই মিথ্যা হবে না
কুবা

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