0 এবং -0 এর মধ্যে পার্থক্য করা কি সম্ভব?


94

আমি জানি যে পূর্ণসংখ্যার মানগুলি হয় 0এবং -0মূলত একই হয়। তবে, আমি ভাবছি যে তাদের মধ্যে পার্থক্য করা সম্ভব কিনা।

উদাহরণস্বরূপ, কোনও চলক বরাদ্দ করা হয়েছে কিনা আমি কীভাবে জানব -0?

bool IsNegative(int num)
{
    // How ?
}

int num = -0;
int additinon = 5;

num += (IsNegative(num)) ? -addition : addition;

-0মেমরিতে মানটি কি ঠিক একইভাবে সংরক্ষণ করা হয় 0?


9
পূর্ণসংখ্যার জন্য, কোনও পার্থক্য নেই।
মারউন

14
এটি বাস্তবায়নের উপর নির্ভর করে, তবে বাস্তবায়নের জন্য যেখানে int2 এর পরিপূরক হিসাবে প্রতিনিধিত্ব করা হয় (এখন পর্যন্ত সর্বাধিক সাধারণভাবে দেখা যায়) 0এবং -0অভিন্ন বিটওয়াইজ উপস্থাপনা রয়েছে।
মানকারসে

11
একটি 2 এর পরিপূরক মেশিনে বিট-স্তরে কোনও পার্থক্য নেই।
মার্কো এ।

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

8
@ ভার্চুয়ালস্পেক এটা ঠিক, আমরা কথা বলছি int। দেখুন ব্যক্তিদের 'সম্পূরক এনকোডিং
সিয়াপান

উত্তর:


112

এটি আপনি যে মেশিনটিকে টার্গেট করছেন তার উপর নির্ভর করে।

পূর্ণসংখ্যার জন্য 2 এর পরিপূরক উপস্থাপনা ব্যবহার করে এমন একটি মেশিনে এবং এর মধ্যে বিট-লেভেলের কোনও পার্থক্য নেই they0-0

যদি আপনার মেশিনটি এর পরিপূরক ব্যবহার করে তবে আপনি অবশ্যই পারবেন

0000 0000   -> signed01111 1111   -> signed0

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

(জেরি কফিন যেমন উল্লেখ করেছেন: এমনকি যদি এর পরিপূরকটি বেশিরভাগ historicalতিহাসিক কারণে বিবেচনা করা হয় তবে স্বাক্ষরযুক্ত বিশালতার উপস্থাপনাগুলি এখনও মোটামুটি সাধারণ এবং নেতিবাচক এবং ধনাত্মক শূন্যের জন্য পৃথক উপস্থাপনা রয়েছে)


6
@ টবিএমসিএনমোবি: কখনও উদ্বিগ্ন হওয়ার মতো যথেষ্ট নয়। আমি যদি অবাক হয়ে থাকি যে কেউ যদি কখনও এ জাতীয় মেশিনের জন্য আউটপুট উত্পাদন করতে কোনও সি ++ কম্পাইলার পোর্ট করতে বিরত থাকে।
বেনজামিন লিন্ডলি

4
আমি বেঞ্জামিন সাথে একমত, ঐতিহাসিকভাবে এটি ব্যবহার সেখানে ছিলাম মেশিন, কিন্তু আজকাল আমি যা এটি ব্যবহার উত্পাদন মেশিন জানেন যে আর না ঘটে। তবুও জানা এবং মনে রাখা সর্বদা ভাল।
মার্কো এ।

4
@TobiMcNamobi একজনের পরিপূরক হয়ে UNISYS 2200 সিস্টেম ব্যবহার এখনও stackoverflow.com/a/12277974/995714 stackoverflow.com/q/6971886/995714
phuclv

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

8
@ হার্কলি: না, এমনকি যদি negativeণাত্মক শূন্য উপস্থাপনা উপস্থিত থাকে, মানটি অভিব্যক্তিটি ব্যবহার করে যে অ্যাসাইনমেন্ট বা আরম্ভের গ্যারান্টি দেয় না, অর্থাত্ ইন্টিরির ধ্রুবকের সাথে অ্যানারি অপারেটর -0প্রয়োগের ফলস্বরূপ , এটি একটি নেতিবাচক শূন্য প্রতিনিধিত্ব। উপস্থাপনা নির্বিশেষে, মানটি কখনই গাণিতিকভাবে বিভিন্ন মান বলে না এবং হয়, কেবলমাত্র সেখানে নেতিবাচক-শূন্য বিট প্যাটার্ন থাকতে পারে। যদি তা থাকে তবে এটি একই সংখ্যাসূচক মানটিকে 0 হিসাবে উপস্থাপন করে-00-0
স্টিভ জেসপ

14

একটির জন্য int(প্রায় সর্বজনীন "2 এর পরিপূরক" উপস্থাপনায়) এর উপস্থাপনা 0এবং -0একই রকম। (অন্যান্য সংখ্যা উপস্থাপনের জন্য এগুলি আলাদা হতে পারে, যেমন, আইইইই 754 ভাসমান পয়েন্ট।)


9
>> 2 এর পরিপূরক উপস্থাপনা ধরে নেওয়া
মার্কো এ।

12

আসুন শুরু করা যাক 0 এর 2 এর পরিপূরককে উপস্থাপন করার মাধ্যমে (অবশ্যই এখানে আরও অনেক সিস্টেম এবং উপস্থাপনা রয়েছে, আমি এখানে এই নির্দিষ্টটি উল্লেখ করছি), 8-বিট ধরে শূন্যটি ধরে নি:

0000 0000

এখন সমস্ত বিটগুলি ফ্লিপ করুন এবং 2 এর পরিপূরক পেতে 1 যুক্ত করুন:

1111 1111 (flip)
0000 0001 (add one)
---------
0000 0000

আমরা পেয়েছি 0000 0000, এবং এটি -0 এর প্রতিনিধিত্বও।

তবে মনে রাখবেন যে 1 এর পরিপূরকটিতে, স্বাক্ষরিত 0 টি 0000 0000, তবে -0 হয় 1111 1111।


4
দয়া করে আমার উত্তরকে উন্নত করার জন্য নিম্নাঞ্চলিকরা কেন জানতে পারবেন?
মারউন

4
অন্যান্য উত্তরগুলির বেশিরভাগ প্রযুক্তিগতভাবে সঠিক হলেও আপনার উত্তরটি ব্যবহারিক, এবং একটি বাস্তবায়ন সরবরাহ করে। ভাল.
umlcat

9

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


সংখ্যার উপস্থাপনাগুলিতে যেগুলি বিদ্যমান তাদের মধ্যে নেতিবাচক শূন্যগুলির আচরণ সি ++ স্ট্যান্ডার্ডের মতো কঠোরভাবে সংজ্ঞায়িত হয়নি। এটি অবশ্য সি স্ট্যান্ডার্ড (আইএসও / আইইসি 9899: 1999) শীর্ষ স্তরের একটি আদর্শিক রেফারেন্স হিসাবে উল্লেখ করেছে [1.2]।

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

এমনকি নেতিবাচক শূন্য উত্পন্ন করতে পারে এমন ক্ষেত্রেও , এমন কোনও গ্যারান্টি নেই যে তারা নেতিবাচক শূন্যকে সমর্থন করে এমন একটি সিস্টেমেও:

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

অতএব, আমরা উপসংহারে পৌঁছাতে পারি: না, এই কেসটি সনাক্ত করার কোনও নির্ভরযোগ্য উপায় নেই। এমনকি যদি এটি না হয় যে আধুনিক কম্পিউটার সিস্টেমে নন-দ্বন্দ্ব-পরিপূরক উপস্থাপনাগুলি খুব অস্বাভাবিক।

সি ++ স্ট্যান্ডার্ড, এর অংশ হিসাবে, "নেতিবাচক শূন্য" শব্দটির কোনও উল্লেখ করে না, এবং স্বাক্ষরিত পরিমাণ এবং তার পরিপূরক উপস্থাপনাগুলির বিবরণ সম্পর্কে খুব কম আলোচনা করেছে, [3.9.1 অনুচ্ছেদ 7] যা তাদের অনুমোদিত তা নয়।


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

তাহলে কেন সি ++ স্ট্যান্ডার্ড এই জাতীয় জিনিসের এত কম বিশদ বিবরণে যায়?
র্যান্ডম 832

4
ব্যক্তিগত স্বাদ, আমি মনে করি, যদি সি ++ স্ট্যান্ডার্ডে ভোট দেওয়া লোকের সংখ্যাটিকে "ব্যক্তিগত" হিসাবে বিবেচনা করা যায় :-) যদি এটি সংজ্ঞাগুলির জন্য সি স্ট্যান্ডার্ডকে পিছিয়ে দিচ্ছিল, তবে এটি এটির একটি সঠিক কাজ করতে পারে এবং এর কোনও বিবরণ নেই, যেমন এটি অন্যান্য ক্ষেত্রে ঘটে।
স্টিভ জেসোপ

"সি ++ হ'ল সিএস প্রোগ্রামিং ভাষার উপর ভিত্তি করে সিএস প্রোগ্রামিং ভাষার উপর ভিত্তি করে একটি সাধারণ উদ্দেশ্য প্রোগ্রামিং ভাষা যা আইএসও / আইইসি 9899: 1999 প্রোগ্রামিং ভাষাগুলি - সি (এরপরে সি স্ট্যান্ডার্ড হিসাবে উল্লেখ করা হয়)।" [১.১ প্যারা ২] এর কোনও আদর্শিক অর্থ আছে? আমি ভেবেছিলাম যে সি ++ স্ট্যান্ডার্ড দ্বারা নির্দিষ্টভাবে ওভাররাইড না করা এমন কোনও কিছুর জন্য সাধারণত সি স্ট্যান্ডার্ডকে অন্তর্ভুক্ত করা।
র্যান্ডম 832

@ র্যান্ডম 832 নং এটি কেবল একটি noteতিহাসিক নোট (উদাহরণস্বরূপ, সি ++ তে কোনও _Boolবা _Complexবা মনোনীত প্রারম্ভিক বা যৌগিক আক্ষরিক) নেই। সি ++ স্ট্যান্ডার্ড জানে যখন সি স্ট্যান্ডার্ডকে কীভাবে অন্তর্ভুক্ত করা যায় - উদাহরণস্বরূপ, [বেসিক.ফান্ডামেন্টাল] / পি 3: "স্বাক্ষরিত এবং স্বাক্ষরবিহীন পূর্ণসংখ্যার ধরণগুলি সি স্ট্যান্ডার্ড, বিভাগ 5.2.4.2.1 এ প্রদত্ত বাধাগুলি পূরণ করবে" "
টিসি

8

যদি আপনার মেশিনের আলাদা আলাদা উপস্থাপনা থাকে -0এবং তা +0, তবে memcmpসেগুলি আলাদা করতে সক্ষম হবে।

প্যাডিং বিট উপস্থিত থাকলে শূন্য ব্যতীত অন্য মানগুলির জন্য একাধিক উপস্থাপনা থাকতে পারে।


5

সি ++ ভাষার স্পেসিফিকেশনে নেতিবাচক শূন্যের মতো কোনও আন্ত নেই ।

এই দুটি শব্দের একমাত্র অর্থ হ'ল আনারি অপারেটর -প্রয়োগ করা 0, যেমন তিনটি প্লাস ফাইভ কেবল বাইনারি অপারেটর এবং +প্রয়োগ করা হয় ।35

যদি পৃথক নেতিবাচক শূন্য থাকে তবে দুটির পরিপূরক (পূর্ণসংখ্যার ধরণের সর্বাধিক সাধারণ উপস্থাপনা) সি ++ বাস্তবায়নের জন্য অপর্যাপ্ত প্রতিনিধিত্ব হতে পারে, কারণ শূন্যের দুটি রূপের উপস্থাপনের উপায় নেই।


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


তবে, যদি ইন্টি 0 এর বিভিন্ন মেমরির উপস্থাপনা (বা কোনও অবধি, বা অন্য কোনও ধরণের কোনও মূল্য) থাকে তবে আপনি এটি memcmpআবিষ্কার করতে ব্যবহার করতে পারেন :

#include <string>

int main() {
    int a = ...
    int b = ...
    if (memcmp(&a, &b, sizeof(int))) {
        // a and b have different representations in memory
    }
}

অবশ্যই, যদি এটি ঘটে থাকে, সরাসরি মেমরি অপারেশনগুলির বাইরে, দুটি মান এখনও একইভাবে কাজ করবে।


4
প্রকৃতপক্ষে, ভাষা তার অস্তিত্বকে বাধ্যতামূলক করে না এর অর্থ এই নয় যে এটি তার অনুপস্থিতি জারি করে। ইঙ্গিত: এটি আদেশ দেয় না।
উত্সর্গকারীর

4
@ ডিডুকুলেটর, সাজান sort "সি ++ ভাষায়", এর অর্থ, "সি ++ ভাষার স্পেসিফিকেশন "। যেহেতু অনুমানের মধ্যে ফ্রুবিনেটরগুলির কোনও উল্লেখ নেই, তাই আমি বলতে পারি যে "সি ++ এর ফ্রুবিনেটর নেই" খুব বেশি অস্পষ্টতা ছাড়াই। আমি ভেবেছিলাম এটি পরিষ্কার ছিল তবে আমি এটি উন্নত করব।
পল ড্রাগার

4
ভাষার বৈশিষ্টগুলিও ইউনিকর্নের কথা উল্লেখ করে না।
ypercubeᵀᴹ

2

সরলকরণের জন্য আমার কল্পনা করা সহজ হয়েছে।

টাইপ করুন int- এ (_32) সঙ্গে সংরক্ষণ করা হয় 32 বিট । 32 বিট মানে 2 ^ 32 = 4294967296 অনন্য মান । এইভাবে:

স্বাক্ষরবিহীন int তথ্য পরিসীমা 0 থেকে 4,294,967,295

নেতিবাচক মানগুলির ক্ষেত্রে এটি কীভাবে সংরক্ষণ করা হয় তার উপর নির্ভর করে। ক্ষেত্রে

একের পরিপূরক মান -0 এর ক্ষেত্রে বিদ্যমান।


4
আমি ডাউনটাভোট করি নি তবে যে প্ল্যাটফর্মগুলির জন্য int32 বিটে সংরক্ষণ করা হয়নি সেগুলি আজকাল কারও পরিপূরকযুক্ত প্ল্যাটফর্মগুলি আরও বেশি জনপ্রিয়।
ম্যাকিয়েজ পাইচোটকা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.