মাইক্রোপ্রসেসরের ALU কীভাবে একটি স্বাক্ষরিত সংখ্যা -7, যে 1111 দ্বারা স্বাক্ষরিত এবং একটি স্বাক্ষরবিহীন 15 নম্বর, 1111 দ্বারা চিহ্নিত করা হয় তার মধ্যে পার্থক্য করতে পারে?
মাইক্রোপ্রসেসরের ALU কীভাবে একটি স্বাক্ষরিত সংখ্যা -7, যে 1111 দ্বারা স্বাক্ষরিত এবং একটি স্বাক্ষরবিহীন 15 নম্বর, 1111 দ্বারা চিহ্নিত করা হয় তার মধ্যে পার্থক্য করতে পারে?
উত্তর:
সংক্ষিপ্ত এবং সহজ উত্তর: এটি হয় না। কোনও আধুনিক মূলধারার সিপিইউ আইএসএ আপনার মনে হয় যেভাবে কাজ করে না।
সিপিইউর জন্য এটি কেবল কিছুটা প্যাটার্ন। এই বিট প্যাটার্নটির অর্থ কী তা ট্র্যাক করা আপনার কাছে প্রোগ্রামার, আপনার হাতে।
সাধারণভাবে, আইএসএগুলি স্টোরের ক্ষেত্রে আসে যখন বিভিন্ন ডেটা ধরণের মধ্যে পার্থক্য করে না। (কোনও এফপিইউতে ভাসমান রেজিস্টারগুলির মতো বিশেষ-উদ্দেশ্যে নিবন্ধগুলি উপেক্ষা করা)) এটি সিপিইউতে বিটের কেবল অর্থহীন নিদর্শন। যাইহোক, ISAs না নির্দেশাবলী বিভিন্ন উপায়ে বিট প্যাটার্ন ব্যাখ্যা করা হতে পারে বিভিন্ন ধরণের আছে। উদাহরণস্বরূপ, গাণিতিক নির্দেশাবলী যেমন MUL
, DIV
, ADD
, SUB
সংখ্যা কিছু যেমন বিট প্যাটার্ন, ব্যাখ্যা যেমন যৌক্তিক নির্দেশনা যেহেতু AND
, OR
, XOR
Booleans থেকে একটি অ্যারের যেমন ব্যাখ্যা। সুতরাং, সঠিক নির্দেশাবলী চয়ন করার জন্য এটি প্রোগ্রামার, (বা দোভাষী বা সংকলকটির লেখক যদি আপনি উচ্চ-স্তরের ভাষা ব্যবহার করেন) is
স্বাক্ষরিত বনাম স্বাক্ষরযুক্ত সংখ্যাগুলির জন্য খুব ভাল পৃথক নির্দেশনা থাকতে পারে, উদাহরণস্বরূপ। কিছু আইএসএর কাছে বাইনারি-কোডেড দশমিকের সাথে পাটিগণিত সম্পর্কিত নির্দেশাবলীও রয়েছে।
তবে নোট করুন যে আমি উপরে "আধুনিক মূলধারার আইএসএ" লিখেছি। বাস্তবে নন-মূলধারার বা historicতিহাসিক আইএসএগুলি ভিন্নভাবে কাজ করে। উদাহরণস্বরূপ, আইবিএম AS / 400 এর মূল 48-বিট সিআইএসসি আইএসএ পাশাপাশি সিস্টেমের বর্তমান পাওয়ার-ভিত্তিক 64-বিট আরআইএসসি আইএসএ এখন পয়েন্টার এবং অন্যান্য মানগুলির মধ্যে পার্থক্য করে। পয়েন্টারগুলিকে সর্বদা ট্যাগ করা হয় এবং এগুলির মধ্যে টাইপ করা তথ্য এবং অধিকার পরিচালনা অন্তর্ভুক্ত থাকে। সিপিইউ জানে যে মান একটি পয়েন্টার কিনা বা না, এবং কেবল অধিকারী আই / ওএস কার্নেলটি বিনা পয়েন্টারে প্যানেলগুলি নিখরচায় মঞ্জুরি দেয়। ব্যবহারকারী অ্যাপ্লিকেশনগুলি কেবলমাত্র স্বল্প সংখ্যক সুরক্ষিত নির্দেশাবলীর সাহায্যে নিজের মালিকের মেমরিটিতে নির্দেশ করতে পয়েন্টারগুলিকেই পরিচালনা করতে পারে।
কিছু historicতিহাসিক আইএসএ ডিজাইনও ছিল যা টাইপ-সচেতনতার কমপক্ষে কিছু সীমিত রূপ অন্তর্ভুক্ত করেছিল।
char
যা 16 বিট স্বাক্ষরবিহীন টাইপ হয়। অবশ্যই, জাভা বাইটকোডে এখনও স্বাক্ষরবিহীন পাটিগণিত নির্দেশাবলী নেই, যেহেতু কোনও char
মানগুলি পাটিগণিতের জন্য স্বয়ংক্রিয়ভাবে int
(32-বিট স্বাক্ষরিত) উন্নীত হয় ।
সংক্ষিপ্ত সংস্করণ: এটি জানেন না। বলার উপায় নেই।
যদি 1111
-7 প্রতিনিধিত্ব করে তবে আপনার কাছে একটি সাইন-মাত্রার উপস্থাপনা থাকবে , যেখানে প্রথম বিটটি হ'ল সাইন এবং বাকী বিটগুলির দৈর্ঘ্য। এই ক্ষেত্রে, গাণিতিক কিছুটা জটিল, যেহেতু স্বাক্ষরবিহীন অ্যাড এবং একটি স্বাক্ষরযুক্ত অ্যাড বিভিন্ন যুক্তি ব্যবহার করে। সুতরাং আপনার সম্ভবত একটি SADD
এবং একটি UADD
অপকোড থাকতে হবে এবং আপনি যদি ভুলটি চয়ন করেন তবে অযৌক্তিক ফলাফল পাবেন।
দু'জনের পরিপূরক প্রতিনিধিত্ব1111
বলা হয় এর মধ্যে প্রায়শই, -1 প্রতিনিধিত্ব করে । এই ক্ষেত্রে, সংখ্যাগুলি স্বাক্ষরিত বা স্বাক্ষরবিহীন থাকলে ALU কেবল যত্ন করে না! উদাহরণস্বরূপ, এর অপারেশন নেওয়া যাক 1110 + 0001
। স্বাক্ষরিত গাণিতিক ক্ষেত্রে, এর অর্থ "-২ + 1", এবং ফলাফলটি -1 ( 1111
) হওয়া উচিত । স্বাক্ষরবিহীন গাণিতিক ক্ষেত্রে, এর অর্থ "14 + 1", এবং ফলাফলটি 15 ( 1111
) হওয়া উচিত । সুতরাং ALU জানে না যে আপনি স্বাক্ষরিত বা স্বাক্ষরবিহীন ফলাফল চান কিনা, এবং এটি যত্নশীল নয়। এটি কেবলমাত্র যোগটি যেমন স্বাক্ষরবিহীন ছিল তা করে এবং আপনি যদি পরে স্বাক্ষরকৃত পূর্ণসংখ্যা হিসাবে বিবেচনা করতে চান তবে এটি আপনার।
সম্পাদনা: রুসলান এবং ড্যানিয়েল শেপলার মন্তব্যগুলিতে যথাযথভাবে উল্লেখ করেছেন, কিছু অপারেটরের এখনও পৃথক স্বাক্ষরযুক্ত এবং স্বাক্ষরবিহীন সংস্করণগুলি প্রয়োজন, এমনকি দু'জনের পরিপূরক মেশিনেও। সংখ্যায় স্বাক্ষর আছে কি না তা জেনে সংযোজন, বিয়োগ, গুণ, সমতা এবং এই জাতীয় সমস্ত কাজ করে। তবে বিভাগ এবং যে কোনও বৃহত্তর / তুলনায় তুলনায় পৃথক সংস্করণ থাকতে হবে।
সম্পাদনা সম্পাদনা করুন: এর পরিপূরকের মতো আরও কিছু উপস্থাপনাও রয়েছে তবে এগুলি মূলত আর কখনও ব্যবহার করা হয় না তাই আপনাকে এগুলি নিয়ে উদ্বিগ্ন হওয়ার দরকার নেই।
<
<=
>=
>
বিভিন্ন বনাম যেহেতু স্বাক্ষরবিহীন operands স্বাক্ষরিত হয় ==
এবং !=
signedness অ্যাগনোস্টিক হয়।
দু'য়ের পরিপূরক গণিতের একটি দুর্দান্ত সুবিধা, যা সমস্ত আধুনিক স্থাপত্যগুলি ব্যবহার করে, তা হ'ল স্বাক্ষরযুক্ত এবং স্বাক্ষরযুক্ত অপারেটর উভয়ের জন্য সংযোজন এবং বিয়োগের নির্দেশাবলী হুবহু একই।
অনেক সিপিইউতে এমনকি গুণ, বিভাজন বা মডিউলাস নির্দেশাবলীও থাকে না। যদি তারা তা করে থাকে তবে তাদের অবশ্যই নির্দেশাবলীর স্বাক্ষরযুক্ত এবং স্বাক্ষরবিহীন স্বতন্ত্র ফর্ম থাকতে হবে এবং সংকলক (বা সমাবেশ-ভাষা প্রোগ্রামার) উপযুক্তটিকে বেছে নিতে পারে।
সিপিইউতে সাধারণত স্বাক্ষরযুক্ত বা স্বাক্ষরযুক্ত তুলনাগুলির জন্য আলাদা আলাদা নির্দেশনা থাকে। উদাহরণস্বরূপ, তুলনা স্বাক্ষর করা উচিত কিনা x86 এর CMP
সাথে JL
(কম হলে ঝাঁপ দাও) অনুসরণ করতে পারে, অথবা তুলনা স্বাক্ষরিত হওয়া উচিত JB
কিনা (নীচে যদি লাফ করুন)। আবার, সংকলক বা প্রোগ্রামার তথ্য প্রকারের জন্য সঠিক নির্দেশিকা বেছে নেবে।
কিছু অন্যান্য নির্দেশাবলী প্রায়শই স্বাক্ষরিত এবং স্বাক্ষরযুক্ত বৈকল্পিকগুলিতে আসে যেমন ডান শিফট বা সাইন-এক্সটেনশনের সাথে বা ছাড়াই বিস্তৃত নিবন্ধে একটি মান লোড করা।
smulh
এবং umulh
শুধুমাত্র গুণ উপরের বিট এবং স্বাক্ষরিত ও স্বাক্ষরবিহীন নির্দেশাবলী আগমন যে উত্স অপারেশন হিসাবে দ্বিগুণ প্রশস্ত একটি রেজিস্টার ফলাফল প্রদান।
এটা হয় না। প্রসেসর এটি কোন ধরণের ডেটা দেখছে এবং কোথায় এটি প্রেরণ করবে তা জানাতে নির্দেশিকা নির্দেশের উপর নির্ভর করে। অপারেন্ডে নিজেই 1s এবং 0 এর কিছুই নেই যা ডেটাটি চার, ফ্লোট, ইনট, স্বাক্ষরিত ইন্ট ইত্যাদি কিনা অন্তর্নিহিতভাবে ALU কে সিগন্যাল করতে পারে যে 1111 যদি একটি বৈদ্যুতিক সার্কিট যা 2s পরিপূরক প্রত্যাশা করে, যাচ্ছে 2s পরিপূরক হিসাবে ব্যাখ্যা করা।
char
হার্ডওয়্যার স্তরে এমন কোনও জিনিস নেই । একসময় মেকানিকাল টেলিপ্রিন্টারগুলির দিনগুলিতে একবারে। কিন্তু আজ, একটি char
হল মাত্র একটি সংখ্যা যতটা হার্ডওয়্যার সংশ্লিষ্ট করা হয়। বিভিন্ন স্ক্রিনে বিভিন্ন সংখ্যা বিভিন্ন বর্ণের আকারের সাথে মিলে যাওয়ার কারণ হ'ল এই সংখ্যাগুলি বড় টেবিলের (যেমন, "ফন্ট" থেকে) বিভিন্ন বিটম্যাপ বা বিভিন্ন অঙ্কন রুটিন নির্বাচন করতে ব্যবহৃত হয়।
আমি ইতিমধ্যে তৈরি উত্তরগুলিতে একটি সংযোজন দিতে চাই:
বেশিরভাগ অন্যান্য উত্তরে এটি লক্ষ করা যায় যে দ্বিগুণ পরিপূরক গাণিতিক ক্ষেত্রে ফলাফল স্বাক্ষরিত এবং স্বাক্ষরবিহীন সংখ্যার জন্য একই হয়:
-2 + 1 = -1 1110 + 0001 = 1111
14 + 1 = 15 1110 + 0001 = 1111
তবে ব্যতিক্রমগুলি রয়েছে:
Division:
-2 / 2 = -1 1110 / 0010 = 1111
14 / 2 = 7 1110 / 0010 = 0111
Comparison:
-2 < 2 = TRUE 1110 < 0010 = TRUE
14 < 2 = FALSE 1110 < 0010 = FALSE
"Typical" (*) multiplication:
-2 * 2 = -4 1110 * 0010 = 11111100
14 * 2 = 28 1110 * 0010 = 00011100
(*) অনেক সিপিইউতে দুটি এন-বিট সংখ্যার গুণনের ফলাফল (2 * n) বিট বিস্তৃত হয়।
এই জাতীয় ক্রিয়াকলাপের জন্য সিপিইউগুলির স্বাক্ষরিত এবং স্বাক্ষরবিহীন গাণিতিকগুলির জন্য পৃথক নির্দেশনা রয়েছে।
এর অর্থ প্রোগ্রামার (বা সংকলক) স্বাক্ষরযুক্ত এবং স্বাক্ষরবিহীন গাণিতিকগুলির জন্য অন্যান্য নির্দেশাবলী ব্যবহার করতে হবে।
উদাহরণস্বরূপ x86 সিপিইউতে div
একটি স্বাক্ষরবিহীন বিভাগ করার জন্য নামের একটি নির্দেশ এবং একটি নির্দেশনা রয়েছেidiv
জন্য জন্য ।
স্বতন্ত্র এবং স্বাক্ষরযুক্ত স্বাক্ষরিত গাণিতিকগুলির জন্য পৃথক পৃথক "শর্তসাপেক্ষ" নির্দেশাবলী (শর্তাধীন জাম্প, সেট-বিট-অন-শর্ত) রয়েছে lic