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




int zero (5)

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

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

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

int num = -0;
int additinon = 5;

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

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


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

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

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

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

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

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

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


আসুন শুরু করা যাক 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।


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


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

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


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

এই দুটি শব্দের একমাত্র অর্থ হ'ল অ্যানারি অপারেটর - 0 প্রয়োগ হয়েছে ঠিক তেমনি তিনটি পাঁচটি কেবল বাইনারি অপারেটর + 3 এবং 5 তে প্রয়োগ হয়।

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

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

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

#include <string>

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

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





negative-number