সমস্ত বিটকে সত্যে সেট করতে -1 ব্যবহার করা কি নিরাপদ?


132

আমি এই প্যাটার্নটি সি ও সি ++ এ প্রচুর ব্যবহার করেছি।

unsigned int flags = -1;  // all bits are true

এটি সম্পন্ন করার জন্য এটি কি ভাল পোর্টেবল উপায়? বা ব্যবহার করছেন 0xffffffffবা ~0আরও ভাল?


1
আমি এটি পাই না, আপনি দয়া করে ব্যাখ্যা করতে পারেন?
কোরাজা

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

@ ক্যামজ্যাকসন মন্তব্যটি করেছেন না এবং সি কোড লেখার যে কেউ মূল্যবোধকে কীভাবে উপস্থাপন করা হয় তার সাথে পরিচিত হতে পারে।
মাইলস রুট

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

উত্তর:


154

আপনি যেমন দেখিয়েছেন ঠিক তেমনটি করার জন্য আমি আপনাকে পরামর্শ দিচ্ছি, কারণ এটি সর্বাধিক সোজা ফরওয়ার্ড forward প্রকৃত সাইন প্রতিনিধির চেয়ে স্বতন্ত্র, -1যা সর্বদা কাজ করবে তা সূচনা করুন , আবার ~কখনও কখনও অবাক করার মতো আচরণও করতে হবে কারণ আপনার সঠিক অপারেন্ড টাইপ থাকতে হবে। তবেই আপনি কোনও unsignedধরণের সর্বাধিক উচ্চ মান পাবেন ।

সম্ভাব্য বিস্ময়ের উদাহরণ হিসাবে, এটি বিবেচনা করুন:

unsigned long a = ~0u;

এটি অগত্যা সমস্ত বিট 1 এর সাথে কোনও প্যাটার্ন সংরক্ষণ করবে না a। তবে এটি প্রথমে একটিতে সমস্ত বিট 1 দিয়ে একটি প্যাটার্ন তৈরি করবে unsigned intএবং তারপরে এটি নির্ধারণ করবে a। যখন unsigned longআরও বিট থাকে তখন যা হয় তা হ'ল সবগুলি 1 হয় না।

এবং এটিকে বিবেচনা করুন, যা নন-টুয়ের পরিপূরক উপস্থাপনায় ব্যর্থ হবে:

unsigned int a = ~0; // Should have done ~0u !

তার কারণ হ'ল ~0সমস্ত বিট উল্টাতে হবে। উল্টানো যা -1দু'জনের পরিপূরক মেশিনে আসবে (যা আমাদের প্রয়োজন মান!) তবে অন্য উপস্থাপনের ফল পাবেন না-1 । কারও পরিপূরক মেশিনে এটি শূন্যের ফলন দেয়। সুতরাং, কারও পরিপূরক মেশিনে উপরেরটি aশূন্যে শুরু হবে ।

আপনার যে জিনিসটি বুঝতে হবে তা হ'ল এটি সমস্ত মান - বিট নয়। ভেরিয়েবলটি একটি মান দিয়ে শুরু করা হয় । ইনিশিয়ালাইজারে আপনি যদি আরম্ভের জন্য ব্যবহৃত ভেরিয়েবলের বিটগুলি সংশোধন করেন তবে মানগুলি সেই বিট অনুসারে উত্পন্ন হবে। মান আপনার যা দরকার আরম্ভ করতে, a, সম্ভাব্য সর্বোচ্চ মান হয় -1বা UINT_MAX। দ্বিতীয়টি নির্ভর করবে এর ধরণের উপর a- আপনার ULONG_MAXএকটি ব্যবহারের প্রয়োজন হবে unsigned long। তবে প্রথমটি তার ধরণের উপর নির্ভর করবে না এবং এটি সর্বাধিক সর্বোচ্চ মান পাওয়ার একটি দুর্দান্ত উপায়।

আমরা সব বিট আছে কিনা তা নিয়ে কথা বলছি না -1(এটি সবসময় হয় না)। এবং আমরা সব বিট আছে কিনা তা নিয়ে কথা বলছি না ~0(এটি অবশ্যই আছে)।

তবে আমরা যে বিষয়ে কথা বলছি তা হ'ল প্রাথমিক flagsভেরিয়েবলের ফলাফল । এবং এটির জন্য, কেবল-1 প্রতিটি প্রকার এবং মেশিনের সাথে কাজ করবে।


9
-1 সকলকে রূপান্তরিত করার নিশ্চয়তা কেন? এটা কি স্ট্যান্ডার্ড দ্বারা গ্যারান্টিযুক্ত?
জলফ

9
রূপান্তরটি যা ঘটে তা হ'ল এটি বারবার ULONG_MAX এর চেয়ে আরও এক যোগ করে যতক্ষণ না এটি সীমার মধ্যে থাকে (সি টিসি 2 খসড়ায় 6.3.1.3)। সি ++ তে এটি একই, একে অন্যভাবে আনুষ্ঠানিকভাবে ব্যবহার করার পদ্ধতি (মডুলো 2 ^ n)। এটি সব গাণিতিক সম্পর্ক নেমে আসে।
জোহানেস স্কাউব -

6
@ লিটব: সর্বাধিক স্বাক্ষরিত মানগুলি পাওয়ার জন্য কাস্টিং -১ অবশ্যই একটি দুর্দান্ত উপায় তবে এটি সত্যই বর্ণনামূলক নয়; এই কারণেই _MAX ধ্রুবক উপস্থিত রয়েছে (সিজেজে SIZE_MAX যোগ করা হয়েছিল); মঞ্জুর করা হয়েছে, সি ++ সংস্করণটি numeric_limits<size_t>::max()কিছুটা দীর্ঘ-বায়ুযুক্ত, তবে অভিনেতারও তাই ...
ক্রিস্টোফ

11
"-1 এর সব বিট আছে কিনা তা নিয়ে আমরা কথা বলছি না (এটি সর্বদা থাকে না) এবং আমরা 0 এর সমস্ত বিট আছে কিনা তা নিয়ে কথা বলছি না (অবশ্যই এটি আছে)"। - হোয়াট ??? আমি ভেবেছিলাম পুরো পয়েন্ট ছিল এর কিভাবে পতাকা work..no যে 1. সব বিট সেট করতে ?? আপনি বিট তাকান । মূল্য সম্পর্কে কে চিন্তা করে?
এমপেন 21 ই

14
@ প্রশ্নকারী কেয়ার কর্কট করুন। তিনি জিজ্ঞাসা করেছেন "সমস্ত বিটকে সত্যে সেট করতে -1 ব্যবহার করা কি নিরাপদ"? এটি কোন বিটগুলি -1প্রতিনিধিত্ব করে তা সম্পর্কে জিজ্ঞাসা করে না , বা বিट्सটি কী ~0রয়েছে তাও জিজ্ঞাসা করে না । আমরা মানগুলির বিষয়ে চিন্তা করতে পারি না, তবে সংকলকটি করে। ক্রিয়াকলাপগুলি মূল্যবোধের সাথে এবং কাজ করে তা আমরা এড়াতে পারি না। মান এর ~0নাও হতে পারে -1, কিন্তু এই মান আপনার প্রয়োজন হয়। আমার উত্তর এবং @ ডিঙ্গোর সারাংশ দেখুন।
জোহানেস স্কাউব - 2:20

49
  • unsigned int flags = -1; বহনযোগ্য।
  • unsigned int flags = ~0; পোর্টেবল নয় কারণ এটি দু'জনের পরিপূরক উপস্থাপনার উপর নির্ভর করে।
  • unsigned int flags = 0xffffffff; পোর্টেবল নয় কারণ এটি 32-বিট ইনট ধরেছে।

আপনি যদি সি স্ট্যান্ডার্ড দ্বারা গ্যারান্টিযুক্ত এমনভাবে সমস্ত বিট সেট করতে চান তবে প্রথমটি ব্যবহার করুন।


10
কীভাবে ~ 0 (যার যার পরিপূরক অপারেটর) দুইটির পরিপূরক উপস্থাপনার উপর নির্ভর করে?
ড্রयू হল

11
আপনার এই পিছনের দিকে আছে। এর সেটিং পতাকাগুলি -1 এ ফ্ল্যাগ করে যা দ্বিগুণ পরিপূরক উপস্থাপনার উপর নির্ভর করে। একটি চিহ্নে + মাত্রার উপস্থাপনা বিয়োগের মধ্যে কেবল দুটি বিট সেট থাকে: সাইন বিট এবং প্রস্থের সর্বনিম্ন উল্লেখযোগ্য বিট।
স্টিফেন সি স্টিল

15
সি স্ট্যান্ডার্ডের প্রয়োজন হয় যে শূন্যের ইনট মানটির সাইন বিট থাকে এবং সমস্ত মান বিট শূন্য হয়। কারও পরিপূরক হওয়ার পরে, সমস্ত বিটগুলি এক। সমস্ত বিটের সেট সহ একটি ইন্টের মানগুলি: সাইন-এন্ড-গ্রেগনিটিউশন: INT_MIN একের পরিপূরক: -0 দুইটির পরিপূরক: -1 সুতরাং বিবৃতিটি "স্বাক্ষরযুক্ত ইন্ট ফ্ল্যাগস = ~ 0;" প্ল্যাটফর্মটির পূর্ণসংখ্যার উপস্থাপনের সাথে উপরের যেকোনও মান মেলে। তবে দুটির পরিপূরকগুলির '-1' হ'ল একমাত্র সমস্ত পতাকা বিটকে একটিতে সেট করবে।
ডিঙ্গো

9
@ স্টিফেন: প্রতিনিধিত্বের সাথে একমত কিন্তু যখন একটি স্বাক্ষরযুক্ত ইন্টার এর জন্য কোনও মান মান নির্ধারিত হয়, স্বাক্ষরযুক্ত স্বীকৃতি ইন্ট ভ্যালুটির অভ্যন্তরীণ উপস্থাপনা গ্রহণ করে (দু'টির পরিপূরক সিস্টেমে যেখানে সাধারণত এটি কাজ করে) তার মানটি পায় না। স্বাক্ষরযুক্ত ইন্টের জন্য নির্ধারিত সমস্ত মান হ'ল মডুলো (UINT_MAX + 1), সুতরাং -1 নির্ধারণের ফলে অভ্যন্তরীণ উপস্থাপনা কোনও বিষয় নয়।
ডিঙ্গো

20
@ মার্ক: আপনি দুটি অপারেশন গুলিয়ে ফেলছেন। অবশ্যই সমস্ত বিট সেট সহ ~0একটি intমান দেয়। কিন্তু একটি বরাদ্দint একটি থেকে unsigned intনা অগত্যা স্বাক্ষরিত বিট প্যাটার্ন হিসাবে একই বিট প্যাটার্ন থাকার স্বাক্ষরবিহীন int- এ স্থাপিত। কেবলমাত্র 2 এর পরিপূরক উপস্থাপনার ক্ষেত্রে এটি সর্বদা ক্ষেত্রে। 1s এর পরিপূরক বা সাইন-মাত্রার উপস্থাপনায়, ভিন্ন বিট প্যাটার্নে ফলাফলকে নেতিবাচক intমান নির্ধারণ unsigned intকরে। এটি কারণ সি ++ স্ট্যান্ডার্ড স্বাক্ষরিত -> স্বাক্ষরযুক্ত রূপান্তরকে মডুলো-সমান মান হিসাবে সংজ্ঞা দেয়, একই বিটগুলির সাথে মান নয়।
স্টিভ জেসোপ

25

সত্যই আমি মনে করি যে সমস্ত এফএফ এর পাঠযোগ্য read মন্তব্যটি হিসাবে এটি একটি এন্টিপ্যাটার্ন, যদি আপনি সত্যই যত্নবান হন যে সমস্ত বিট সেট / সাফ হয়েছে, আমি যুক্তি দেব যে আপনি সম্ভবত এমন পরিস্থিতিতে আছেন যেখানে আপনি যেভাবেই চলকের আকারের বিষয়ে যত্নবান হন, যা উত্সাহের মতো কিছু করার জন্য ডাকে :: uint16_t ইত্যাদি


এমন অনেকগুলি কেস রয়েছে যেখানে আপনার এতটা যত্ন নেই তবে সেগুলি খুব কমই rare উদাহরণস্বরূপ যে অ্যালগরিদমগুলি এন বিটের ডেটাसेटগুলিতে কাজ করে তা এটিকে ভেঙে আকারের (স্বাক্ষরবিহীন) * CHAR_BIT প্রতিটি বিট করে।
এমসাল্টারস

2
+1 টি। এমনকি যদি ডেটাটাইপের আকার # এর এফ এর চেয়ে বড় হয় (যেমন, আপনি সমস্ত বিটকে সত্যে সেট করেননি), যেহেতু আপনি স্পষ্টভাবে মান নির্ধারণ করছেন, আপনি কমপক্ষে সচেতন থাকবেন কোন বিটগুলি "নিরাপদ" "..
এমপেন

17

উল্লিখিত সমস্যাগুলি এড়ানোর একটি উপায় সহজভাবে করা:

unsigned int flags = 0;
flags = ~flags;

পোর্টেবল এবং বিন্দু।


2
কিন্তু তারপর আপনার কি ডিক্লেয়ার করার ক্ষমতা হারাতে flagsযেমন const
ডেভিড স্টোন

1
@ ডেভিডস্টোনunsigned int const flags = ~0u;

@ জোয়েডবার্গ '- এটি দুটির পরিপূরক ব্যতীত অন্য সিস্টেমে কাজ করতে ব্যর্থ। উদাহরণস্বরূপ, একটি সাইন- ~0প্রবণতা সিস্টেমে, একটি পূর্ণসংখ্যা যা সমস্ত বিট 1 তে সেট করা থাকে তবে আপনি যখন এটিটিকে ভেরিয়েবলটিতে অর্পণ intকরেন , আপনি (32-বিট ধরে ) থেকে একটি মান রূপান্তর করেন যা একটি পূর্ণসংখ্যা সমস্ত বিট ছাড়াই তবে প্রথম সেটটি 1 এunsignedflags-2**31int(-2**31 % 2**32) == 2**31
ডেভিড স্টোন

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

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

13

আমি নিশ্চিত নই যে পতাকাগুলির জন্য একটি স্বাক্ষরযুক্ত ইন্ট ব্যবহার করা সি ++ এ প্রথম স্থানে থাকা ভাল ধারণা। বিটসেট এবং এর মতো কী?

std::numeric_limit<unsigned int>::max()আরও ভাল কারণ 0xffffffffধরে নেওয়া হয়েছে যে স্বাক্ষরবিহীন ইন্টি একটি 32-বিট পূর্ণসংখ্যা।


আমি এটির স্ট্যান্ডার্ডের কারণে এটি পছন্দ করি তবে এটি খুব শব্দযুক্ত এবং এটি আপনাকে টাইপটি দুবার বর্ণনা করে। 0 ব্যবহার করা সম্ভবত নিরাপদ যেহেতু 0 কোনও পূর্ণসংখ্যার ধরণের হতে পারে। (যদিও আমি সচেতন
সেখান থেকে

সত্যই এটি শব্দযুক্ত একটি সুবিধা হিসাবে দেখা যেতে পারে। তবে আমি 0 ডলারও পছন্দ করি।
এডুয়ার্ড এ।

2
আপনি স্ট্যান্ডার্ড UINT_MAX ম্যাক্রো দিয়ে শব্দটি প্রশমিত করতে পারেন, যেহেতু আপনি যেভাবেই স্বাক্ষরবিহীন প্রকারটি হার্ডকডিং করছেন।

2
@ ম্যাক আপনি সি ++ 11 এর সাথে টাইপটি উল্লেখ করে এড়াতে পারবেন autoauto const flags = std::numeric_limit<unsigned>::max()
ডেভিড স্টোন

11
unsigned int flags = -1;  // all bits are true

"এটি সম্পাদন করার জন্য এটি কি একটি ভাল [,] বহনযোগ্য উপায়?"

সুবহ? হ্যাঁ

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

এছাড়াও, এই পদ্ধতিটি সংকেত সংকলনের প্রবণ । আপনার সংকলককে পঙ্গু না করে সতর্কবার্তাটি সরিয়ে দেওয়ার জন্য আপনার একটি স্পষ্ট কাস্টের প্রয়োজন। উদাহরণ স্বরূপ,

unsigned int flags = static_cast<unsigned int>(-1);

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

আমার পরামর্শটি হ'ল লক্ষ্য ধরণের দিকে মনোযোগ দিন এবং নিশ্চিত করুন যে কোনও নিখুঁত রূপান্তর নেই। উদাহরণ স্বরূপ:

unsigned int flags1 = UINT_MAX;
unsigned int flags2 = ~static_cast<unsigned int>(0);
unsigned long flags3 = ULONG_MAX;
unsigned long flags4 = ~static_cast<unsigned long>(0);

এগুলি সবই আপনার সহকর্মী প্রোগ্রামারদের কাছে সঠিক এবং আরও সুস্পষ্ট

এবং সি ++ 11 সহ : আমরা autoএর যে কোনওটিকে আরও সরল করতে ব্যবহার করতে পারি :

auto flags1 = UINT_MAX;
auto flags2 = ~static_cast<unsigned int>(0);
auto flags3 = ULONG_MAX;
auto flags4 = ~static_cast<unsigned long>(0);

আমি সঠিক এবং সুস্পষ্ট বিবেচনা সহজভাবে সঠিক চেয়ে ভাল।


10

-1 কে কোনও স্বাক্ষরবিহীন প্রকারে রূপান্তর করা সর্বজনীন ফলাফলের মান দ্বারা গ্যারান্টিযুক্ত । ব্যবহারের ~0Uসাধারণত খারাপ, যেহেতু 0টাইপ হয়েছে unsigned int, যদি না আপনি স্পষ্টভাবে লেখার কিছু, এবং একটি বড় স্বাক্ষরবিহীন ধরনের সমস্ত বিট পূরণ হবে না ~0ULL। বুদ্ধিমান সিস্টেমে ~0একইরকম হওয়া উচিত -1, তবে যেহেতু স্ট্যান্ডার্ডটি পরিপূরক এবং সাইন / বিশালতার প্রতিনিধিত্বের অনুমতি দেয় তাই কঠোরভাবে বলা যায় এটি পোর্টেবল নয়।

অবশ্যই 0xffffffffআপনার ঠিক 32 টি বিট প্রয়োজন জানা থাকলে অবশ্যই তা লিখতে সর্বদা ঠিক আছে , তবে -1 এর সুবিধা রয়েছে যে কোনও ধরণের ম্যাক্রো যেমন একাধিক প্রকারের সাথে কাজ করে এমন ধরণের আকার আপনি জানেন না এমনকি এটি কোনও প্রসঙ্গে কাজ করবে , বা যদি প্রয়োগের মাধ্যমে ধরণের আকার পরিবর্তিত হয়। আপনি টাইপ জানি না, অন্য সুরক্ষিত উপায় অল-বেশী সীমা ম্যাক্রো হয় পেতে UINT_MAX, ULONG_MAX, ULLONG_MAX, ইত্যাদি

ব্যক্তিগতভাবে আমি সর্বদা -1 ব্যবহার করি। এটি সর্বদা কাজ করে এবং আপনাকে এটি সম্পর্কে চিন্তা করতে হবে না।


FWIW, যদি আমি "সমস্ত 1 বিট" আমি ব্যবহার করি তবে ~(type)0(ভাল, typeঅবশ্যই ডানটি পূরণ করুন )। শূন্য Castালাই এখনও শূন্যের ফলস্বরূপ, সুতরাং এটি পরিষ্কার and এবং লক্ষ্য ধরণের সমস্ত বিট উপেক্ষা করা বেশ পরিষ্কারভাবে সংজ্ঞায়িত। এটি প্রায়শই হয় না যে আমি আসলে সেই অপারেশনটি চাই যদিও; YMMV।
ডোনাল ফেলো

6
@ ডোনাল: আপনি কেবল ভুল সি উল্লেখ করে যে, স্বাক্ষরবিহীন প্রকারের সাথে খাপ খায় না এমন মান রূপান্তর করার সময় মানগুলি 2 ^ n মডুলো হ্রাস হয় যেখানে n গন্তব্য প্রকারের বিটের সংখ্যা। এটি স্বাক্ষরিত মান এবং বৃহত্তর স্বাক্ষরযুক্ত প্রকারের ক্ষেত্রে উভয়ই প্রযোজ্য। দ্বিগুণ পরিপূরকের সাথে এর কোনও যোগসূত্র নেই।
আর .. গিথহাব বন্ধ হেল্পিং আইসিসি

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

1
@ আর: var = ~(0*var)মামলাটি varস্বাক্ষরবিহীন প্রকারের চেয়ে সঙ্কীর্ণ হওয়ার কারণে ব্যর্থ হবে int। সম্ভবত var = ~(0U*var)? (ব্যক্তিগতভাবে আমি এখনও পছন্দ করি -1)।
ক্যাফে

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

5

#include <limits.h>আপনার যতগুলি অন্তর্ভুক্ত থাকে ততক্ষণ আপনার কেবল ব্যবহার করা উচিত

unsigned int flags = UINT_MAX;

আপনি যদি একটি দীর্ঘ মূল্য বিট চান, আপনি ব্যবহার করতে পারেন

unsigned long flags = ULONG_MAX;

স্বাক্ষরিত পূর্ণসংখ্যাগুলি কীভাবে কার্যকর করা হয় তা নির্বিশেষে এই মানগুলিতে ফলাফলের সমস্ত মান বিট 1 নির্ধারণের গ্যারান্টি দেওয়া হয়।


1
আপনার প্রস্তাবিত ধ্রুবকগুলি আসলে সীমাবদ্ধতাগুলিতে সংজ্ঞায়িত করা হয়েছে - stdint.h অতিরিক্ত সংখ্যার ধরণের (নির্দিষ্ট আকারের পূর্ণসংখ্যা, ইন্টিপ্টর_টি, ...) এর সীমাবদ্ধতা রয়েছে
ক্রিস্টোফ

5

হ্যাঁ. অন্যান্য উত্তরে যেমন উল্লেখ করা হয়েছে, -1সর্বাধিক বহনযোগ্য; তবে এটি খুব শব্দার্থক নয় এবং সংকলক সতর্কতাগুলি ট্রিগার করে।

এই সমস্যাগুলি সমাধান করতে, এই সাধারণ সহায়িকার চেষ্টা করুন:

static const struct All1s
{
    template<typename UnsignedType>
    inline operator UnsignedType(void) const
    {
        static_assert(std::is_unsigned<UnsignedType>::value, "This is designed only for unsigned types");
        return static_cast<UnsignedType>(-1);
    }
} ALL_BITS_TRUE;

ব্যবহার:

unsigned a = ALL_BITS_TRUE;
uint8_t  b = ALL_BITS_TRUE;
uint16_t c = ALL_BITS_TRUE;
uint32_t d = ALL_BITS_TRUE;
uint64_t e = ALL_BITS_TRUE;

3
একজন সি প্রোগ্রামার হিসাবে, এর মতো কোডটি রাতে আমার খারাপ স্বপ্ন দেয়।
jforberg

এবং কি ঘটে যখন তোমার মত প্রেক্ষাপটে এটি ব্যবহার ALL_BITS_TRUE ^ aযেখানে aএকটি স্বাক্ষরিত পূর্ণসংখ্যা? প্রকারটি স্বাক্ষরিত পূর্ণসংখ্যার স্থির থাকে এবং বিট-প্যাটার্ন (অবজেক্টের উপস্থাপনা) লক্ষ্য 2 এর পরিপূরক বা না হওয়ার উপর নির্ভর করে।
পিটার

না, ALL_BITS_TRUE ^ aএকটি সংকলন ত্রুটি দেয় কারণ ALL_BITS_TRUEঅস্পষ্ট। তবে এটি ব্যবহার করা যেতে পারে uint32_t(ALL_BITS_TRUE) ^ a। আপনি নিজে সিপিপি.এস-এ চেষ্টা করে দেখতে পারেন :) আজকাল আমি নিশ্চিত হয়েছি যে ব্যবহারকারীরা ব্যবহারের চেষ্টা করবেন না তা নিশ্চিত static_assert(std::is_unsigned<UnsignedType>::value, "This is designed only for unsigned types");করার operatorজন্য আমি এতে একটি যুক্ত করতাম int(ALL_BITS_TRUE)। আমি উত্তর আপডেট করব।
ডায়মন্ড পাইথন

3

আমি -1 জিনিস না। এটি বরং স্বজ্ঞাত (কমপক্ষে আমার কাছে)। স্বাক্ষরযুক্ত ডেটা একটি স্বাক্ষরযুক্ত ভেরিয়েবলকে অর্পণ করা কেবল স্বাভাবিক প্রাকৃতিক আদেশের লঙ্ঘন বলে মনে হয়।

আপনার পরিস্থিতিতে আমি সর্বদা ব্যবহার করি 0xFFFF। (অবশ্যই পরিবর্তনশীল আকারের জন্য Fs এর সঠিক সংখ্যাটি ব্যবহার করুন))

[বিটিডাব্লু, আমি খুব কমই রিয়েল-ওয়ার্ল্ড কোডে -১ ট্রিকটি দেখতে পাচ্ছি]]

উপরন্তু, যদি আপনি সত্যিই একটি vairable মধ্যে পৃথক বিট যত্নশীল, এটা ভাল ধারণা স্থায়ী-প্রস্থের ব্যবহার শুরু করতে হবে uint8_t, uint16_t, uint32_tধরনের।


2

ইন্টেলের আইএ -32 প্রসেসরগুলিতে 0xFFFFFFFF একটি 64-বিট নিবন্ধে লিখতে এবং প্রত্যাশিত ফলাফলগুলি পাওয়া ঠিক হবে। এটি কারণ IA32e (আইএ 32-তে 64-বিট এক্সটেনশন) কেবল 32-বিট ইমিমেডিয়েট সমর্থন করে। -৪-বিট নির্দেশে 32-বিট ইমিমেডিয়েটসকে 64-বিটগুলিতে সাইন-প্রসারিত করা হয়।

নিম্নলিখিতটি অবৈধ:

mov rax, 0ffffffffffffffffh

নিম্নলিখিতটি RAX এ 64 1 গুলি রাখে:

mov rax, 0ffffffffh

কেবল সম্পূর্ণতার জন্য, নিম্নলিখিতগুলি RAX এর নীচের অংশে (1 ওরফে EAX) 321 গুলি রাখে:

mov eax, 0ffffffffh

এবং আসলে আমি প্রোগ্রামগুলি ব্যর্থ করেছিলাম যখন আমি 0xffffffff একটি 64-বিট ভেরিয়েবলে লিখতে চেয়েছিলাম এবং তার পরিবর্তে আমি 0xffffffffffffffff পেয়েছিলাম। সি তে এটি হবে:

uint64_t x;
x = UINT64_C(0xffffffff)
printf("x is %"PRIx64"\n", x);

ফলাফল হলো:

x is 0xffffffffffffffff

আমি এগুলি সমস্ত উত্তরের মন্তব্য হিসাবে পোস্ট করতে ভেবেছিলাম যে বলেছিল যে 0xFFFFFFFF 32 বিট ধরেছে, কিন্তু এত লোকেরা এর উত্তর দিয়েছিল আমি অনুভব করেছি যে আমি এটি একটি পৃথক উত্তর হিসাবে যুক্ত করব।


1
অভিনন্দন, আপনি একটি সংকলক বাগ খুঁজে পেয়েছেন!
টিসি।

এটি কি বাগ হিসাবে কোথাও নথিভুক্ত করা হয়েছে?
নাথান ফেলম্যান

1
ধরে নেওয়া যেমন UINT64_C(0xffffffff)এমন কিছুতে প্রসারিত হয় 0xffffffffuLLএটি অবশ্যই একটি সংকলক বাগ। সি স্ট্যান্ডার্ডটি মূলত মানগুলি নিয়ে আলোচনা করে , প্রতিনিধিত্ব করা মানটি 0xffffffff4294967295 (36893488147419103231 নয়) এবং স্বাক্ষরিত পূর্ণসংখ্যার দৃষ্টিতে কোনও রূপান্তর নেই।
টিসি।

2

ইস্যুগুলির একটি খুব স্পষ্ট ব্যাখ্যা জন্য লিটব এর উত্তর দেখুন।

আমার মতবিরোধটি হ'ল, খুব কঠোরভাবে বলতে গেলে, উভয় ক্ষেত্রেই কোনও গ্যারান্টি নেই। আমি এমন কোনও আর্কিটেকচারের কথা জানি না যা সমস্ত বিট সেট হিসাবে 'বিটের সংখ্যার শক্তির চেয়ে দু'জনের চেয়ে কম স্বাক্ষরিত মানটির প্রতিনিধিত্ব করে না, তবে এখানে স্ট্যান্ডার্ড আসলে কী বলেছে (3.9.1 / 7 Plus) নোট 44):

অবিচ্ছেদ্য ধরণের উপস্থাপনাগুলি একটি বিশুদ্ধ বাইনারি সংখ্যা সিস্টেম ব্যবহার করে মানগুলি সংজ্ঞায়িত করবে। [দ্রষ্টব্য 44:] বাইনারি অঙ্কগুলি 0 এবং 1 ব্যবহার করে এমন পূর্ণসংখ্যার জন্য একটি অবস্থানগত প্রতিনিধিত্ব, যেখানে ক্রমাগত বিট দ্বারা প্রতিনিধিত্ব করা মানগুলি 1 দিয়ে শুরু হয় এবং 2 এর ধারাবাহিক অবিচ্ছেদ্য শক্তি দ্বারা গুণিত হয়, সম্ভবত বিট ব্যতীত সর্বোচ্চ অবস্থান।

এটি বিটগুলির মধ্যে একটিও যে কোনও কিছু হওয়ার সম্ভাবনা ছেড়ে দেয়।


সাধারণভাবে, আমরা প্যাডিং বিটের মান সম্পর্কে নিশ্চিত হতে পারি না। এবং যদি আমরা চাই তবে আমরা বিপদে পড়তে পারি যেহেতু আমরা তাদের জন্য একটি ফাঁদ উপস্থাপনা তৈরি করতে পারি (এবং এটি সংকেত বাড়াতে পারে)। তবে, স্টাডির কোনও প্যাডিং বিট না থাকার জন্য স্বাক্ষরযুক্ত চরটি প্রয়োজন, এবং সি ++ স্ট্যান্ডার্ডে 4.7 / 2 তে বলা হয়েছে যে একটি পূর্ণসংখ্যাকে একটি স্বাক্ষরযুক্ত প্রকারে রূপান্তরিত করে, ফলস্বরূপ স্বাক্ষরযুক্ত ভেরিয়েবলের মান হ'ল উত্স পূর্ণসংখ্যার মানের সাথে সর্বনিম্ন মান, (মডুলো 2 ^ n, এন == স্বাক্ষরবিহীন প্রকারের বিট সংখ্যা)। তারপরে (-1) == ((2 ^ n) -1) (মোড 2 ^ n)। 2 ^ n-1 এর খাঁটি বাইনারি নম্বর পদ্ধতিতে সমস্ত বিট সেট করা আছে।
জোহানেস স্কাউব - লিটব

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

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

1
স্ট্যান্ডার্ডটির কাছে মনে হয় '2 এর পরিপূরক, 1 এর পরিপূরক এবং স্বাক্ষরযুক্ত বিশালতার' উপস্থাপনাগুলি মনে আছে, তবে কোনও কিছুর বাইরে যেতে চান না। উপস্থাপনা ট্র্যাপিং সম্পর্কে আকর্ষণীয় পয়েন্ট। যতদূর আমি বলতে পারি, আমি যেটুকু উদ্ধৃত করেছি সেটি হ'ল স্ট্যান্ডার্ড সম্পর্কিত যতটা 'খাঁটি বাইনারি সংখ্যা সিস্টেম' এর সংজ্ঞা - শেষে 'বিট' বাদে কাস্টিং -১ এর গ্যারান্টিযুক্ত কিনা তা সম্পর্কে আমার একমাত্র সন্দেহ হবে।
জেমস হপকিন

2

যদিও 0xFFFF(বা0xFFFFFFFF , ইত্যাদি) পড়া সহজ হতে পারে তবে কোডে বহনযোগ্যতা ভঙ্গ করতে পারে যা অন্যথায় বহনযোগ্য be উদাহরণস্বরূপ, কোনও ডাটা স্ট্রাকচারে কতগুলি আইটেম নির্দিষ্ট বিট সেট করে (গণ্যকারী দ্বারা নির্দিষ্ট বিট নির্দিষ্ট করা হয়) তা গণনা করার জন্য একটি লাইব্রেরির রুটিন বিবেচনা করুন। রুটিনগুলি বিটগুলি কী উপস্থাপন করে সে সম্পর্কে পুরোপুরি অজ্ঞায়িত হতে পারে তবে এখনও একটি "সমস্ত বিট সেট" ধ্রুবক থাকা দরকার। এই জাতীয় ক্ষেত্রে -1 হেক্স ধ্রুবকের চেয়ে অনেক বেশি ভাল হবে কারণ এটি কোনও বিট আকারের সাথে কাজ করবে।

অন্য সম্ভাবনা, যদি একটি typedefবিটমাস্কের জন্য মান ব্যবহার করা হয় তবে ~ (বিটমাস্কটাইপ) 0 ব্যবহার করা হবে; যদি বিট-মাস্কের শুধুমাত্র একটি 16 বিট টাইপ হতে হবে, যে অভিব্যক্তি মাত্র 16 বিট সেট (এমনকি যদি 'int- এ' অন্যথায় 32 বিট হবে) কিন্তু যেহেতু 16 বিট যে সব প্রয়োজন হয় হবে, কিছু জরিমানা করা উচিত হবে প্রদত্ত এক যে প্রকৃতপক্ষে টাইপকাস্টে উপযুক্ত টাইপ ব্যবহার করে।

ঘটনাক্রমে, ফর্মটির এক্সপ্রেশনগুলিতে longvar &= ~[hex_constant]একটি কদর্য গোচা থাকে যদি হেক্স ধ্রুবকটি একটি মাপসই করা খুব বড় হয় তবে এটি একটিতে intফিট করে unsigned int। যদি একটি int16 বিট হয়, তবে longvar &= ~0x4000;বা longvar &= ~0x10000; এর একটি বিট সাফ করবে longvar, তবে longvar &= ~0x8000;বিট 15 এবং এর উপরে সমস্ত বিট সাফ করবে। মানগুলি যেগুলি মাপসই intহবে তাতে পরিপূরক অপারেটরটি কোনও প্রকারে প্রয়োগ করা intহবে, তবে ফলাফলটি longউপরের বিটগুলি সেট করে, এতে প্রসারিত সাইন হবে । মানগুলি যেগুলির জন্য খুব বড়, unsigned intতাদের পরিপূরক অপারেটর প্রকারে প্রয়োগ করা হবে long। যাইহোক, এই আকারগুলির মধ্যে থাকা মানগুলি পরিপূরক অপারেটরটিকে টাইপ করতে প্রয়োগ করবে unsigned int, যা পরে longসাইন এক্সটেনশান ছাড়াই টাইপে রূপান্তরিত হবে ।


1

ব্যবহারিকভাবে: হ্যাঁ

তাত্ত্বিকভাবে: না

-1 = 0xFFFFFFFFF (বা আপনার প্ল্যাটফর্মে কোনও আকার যাইহোক আকার) কেবলমাত্র দুটির পরিপূরক গাণিতিকের সাথেই সত্য। অনুশীলনে, এটি কার্যকর হবে, তবে সেখানে লিগ্যাসি মেশিন রয়েছে (আইবিএম মেইনফ্রেমস ইত্যাদি) যেখানে আপনি দু'জনের পরিপূর্ণ প্রতিনিধিত্বের পরিবর্তে সত্যিকারের চিহ্ন চিহ্ন পেয়েছেন। আপনার প্রস্তাবিত ~ 0 সমাধানটি সর্বত্র কাজ করা উচিত।


6
আমিও বলেছি। তবে আমি বুঝতে পেরেছিলাম যে আমি ভুল ছিলাম, যেহেতু -1 স্বাক্ষরিত সর্বদা রূপের নিয়মের অধীনে সাইন ইন করা সর্বাধিক_আরতে রূপান্তর করে, মূল্য উপস্থাপনা নির্বিশেষে। কমপক্ষে, এটি সি ++ এ করে, আমার কাছে হাতে সি স্ট্যান্ডার্ড নেই।
স্টিভ জেসোপ

6
একটি অস্পষ্টতা আছে। -1 0xFFFFFFFF নয়। -1 হ'ল 0xFFFFFFFFF যদি স্বাক্ষরযুক্ত স্বাক্ষরে (32 বিট থাকা) রূপান্তরিত হয়। এটাই এই আলোচনাটিকে এত কঠিন করে তুলছে যা আমি ভাবি। এই বিট স্ট্রিংগুলি নিয়ে কথা বলার সময় অনেকের মনেই আলাদা আলাদা জিনিস থাকে।
জোহানেস স্কাউব -

1

অন্যরা যেমন উল্লেখ করেছেন, -1 হ'ল একটি পূর্ণসংখ্যা তৈরির সঠিক উপায় যা সমস্ত বিটকে 1 সেট করে একটি স্বাক্ষরবিহীন প্রকারে রূপান্তরিত করে However তবে, সি ++ এর মধ্যে সবচেয়ে গুরুত্বপূর্ণ বিষয়টি সঠিক ধরণগুলি ব্যবহার করা using অতএব, আপনার সমস্যার সঠিক উত্তর (যার মধ্যে আপনি জিজ্ঞাসা প্রশ্নের উত্তর অন্তর্ভুক্ত) এটি হ'ল:

std::bitset<32> const flags(-1);

এটিতে সর্বদা আপনার প্রয়োজনীয় বিটের সঠিক পরিমাণ থাকবে। std::bitsetঅন্যান্য উত্তরে উল্লিখিত একই কারণে এটি 1 তে সেট সমস্ত বিট সহ একটি তৈরি করে।


0

এটি অবশ্যই নিরাপদ, যেহেতু -1 এ সবসময় উপলব্ধ সমস্ত বিট সেট থাকবে তবে আমি ভাল ~ 0 পছন্দ করি। -1 কেবল একটির জন্য খুব বেশি কিছু বোঝায় না unsigned int0xFF... ভাল না কারণ এটি প্রকারের প্রস্থের উপর নির্ভর করে।


4
"0xFF ... ভাল না কারণ এটি প্রকারের প্রস্থের উপর নির্ভর করে" যাবার একমাত্র বুদ্ধিমান উপায়, আমার মনে হয়। আপনার প্রোগ্রামে প্রতিটি পতাকা / বিটের অর্থ কী তা আপনি স্পষ্টভাবে নির্ধারণ করার কথা supposed সুতরাং, যদি আপনি নির্ধারণ যে আপনার পতাকার সঞ্চয় করতে সর্বনিম্ন 32 বিট ব্যবহার করছেন, আপনি নিজেকে সেই 32 বিট ব্যবহার করতে সীমিত করা উচিত, int- এ প্রকৃত আকার কিনা 32 বা 64
জুয়ান পাবলো Califano

0

আমি বলি:

int x;
memset(&x, 0xFF, sizeof(int));

এটি সর্বদা আপনাকে পছন্দসই ফলাফল দেবে।


4
9-বিট চরগুলি সহ সিস্টেমে নেই!
টিসি।

0

স্বাক্ষরবিহীন প্রকারের জন্য একটিকে সমস্ত বিট বরাদ্দ করা প্রদত্ত প্রকারের জন্য সর্বাধিক সম্ভাব্য মান গ্রহণের সমান
এবং সমস্ত স্বাক্ষরবিহীন পূর্ণসংখ্যার প্রকারের ক্ষেত্রে প্রশ্নের ক্ষেত্র প্রসারিত করার সমতুল্য :

-1 বরাদ্দ করা সি এবং সি ++ উভয়ের জন্য যেকোন স্বাক্ষরযুক্ত পূর্ণসংখ্যার টাইপ (স্বাক্ষরযুক্ত int, uint8_t, uint16_t ইত্যাদি) এর জন্য কাজ করে।

বিকল্প হিসাবে, সি ++ এর জন্য, আপনি যা করতে পারেন:

  1. অন্তর্ভুক্ত <limits>এবং ব্যবহারstd::numeric_limits< your_type >::max()
  2. একটি কাস্টম টেম্প্লেটেড ফাংশন লিখুন (এটি কিছু বিচক্ষণতার চেকেরও অনুমতি দেয়, যেমন গন্তব্যের ধরণটি সত্যই স্বাক্ষরবিহীন প্রকারের হলে)

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


0

অর্থটিকে আরও স্পষ্ট করে তোলার একটি উপায় এবং ধরণের পুনরাবৃত্তি এড়াতে:

const auto flags = static_cast<unsigned int>(-1);

-6

হ্যাঁ প্রদর্শিত প্রতিনিধিত্বটি খুব সঠিক যেমন আমরা অন্যভাবে এটি করি তবে আপনাকে সমস্ত বিট বিপরীত করার জন্য অপারেটরের প্রয়োজন হবে তবে এই ক্ষেত্রে আমরা যদি মেশিনে পূর্ণসংখ্যার আকার বিবেচনা করি তবে যুক্তিটি বেশ সহজবোধ্য is

উদাহরণস্বরূপ, বেশিরভাগ মেশিনে একটি পূর্ণসংখ্যা 2 বাইট = 16 বিট সর্বাধিক মান ধরে রাখতে পারে এটি 2 ^ 16-1 = 65535 2 ^ 16 = 65536

0% 65536 = 0 -1% 65536 = 65535 যা 1111 ............. 1 তে সমবেত হয় এবং সমস্ত বিট 1 তে সেট করা হয় (আমরা যদি 65536 মডেলের অবশিষ্টাংশগুলি বিবেচনা করি) তাই এটি অনেক বেশি সোজা এগিয়ে

আমি অনুমান করি

না আপনি যদি এই ধারণাটি বিবেচনা করেন তবে এটি স্বাক্ষরযুক্ত ইনটগুলির জন্য পুরোপুরি ডাইনে এবং এটি আসলে কার্যকর হয়

শুধু নিম্নলিখিত প্রোগ্রামের টুকরা পরীক্ষা করুন

int প্রধান () {

unsigned int a=2;

cout<<(unsigned int)pow(double(a),double(sizeof(a)*8));

unsigned int b=-1;

cout<<"\n"<<b;

getchar();

return 0;

}

4 বাইট পূর্ণসংখ্যার জন্য খ = 4294967295 যা -1% 2 ^ 32 এর উত্তর

সুতরাং এটি স্বাক্ষরবিহীন পূর্ণসংখ্যার জন্য পুরোপুরি বৈধ

কোনও ত্রুটির ক্ষেত্রে plzz রিপোর্ট


9
দুটি মন্তব্য: প্রথমত, আপনি "বেশিরভাগ" মেশিনে পূর্ণসংখ্যার আকার সম্পর্কে মৃত ভুল। দ্বিতীয়ত, আপনার টিএসটি iz খুব শক্ত 2 টি আমাদের তাত্পর্যপূর্ণ ধরণের সেক্রেটিক ভাষার কারণে 2 টি পড়েন। আমাদের সহজ সরল ইংরেজি
কনরাড রুডল্ফ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.