সি “ইনট” 2 বাইট বা 4 বাইটের আকার?


168

সি-তে একটি পূর্ণসংখ্যা পরিবর্তনশীল 2 বাইট বা 4 বাইট দখল করে? এটি নির্ভর করে কিসের কারণগুলি?

বেশিরভাগ পাঠ্যপুস্তক বলে যে পূর্ণসংখ্যার ভেরিয়েবলগুলি 2 বাইট দখল করে। তবে আমি যখন একটি প্রোগ্রাম পরিচালনা করি যখন একটি পূর্ণসংখ্যার অ্যারের ক্রমাগত ঠিকানাগুলি মুদ্রণ করা হয় তখন এটি 4 এর পার্থক্য দেখায়।



1
intবেশ কয়েকটি পূর্ণসংখ্যার ধরণের মধ্যে একটি। আপনি "পূর্ণসংখ্যার" আকার সম্পর্কে জিজ্ঞাসা করেছেন; আপনি সম্ভবত আকার সম্পর্কে জিজ্ঞাসা করতে চেয়েছিলেন int
কিথ থমসন

3
এবং আপনার আরও ভাল পাঠ্যপুস্তক সন্ধান করা উচিত। একটি পাঠ্যপুস্তক যা বলে যে int2 বাইট (ক) সম্ভবত একটি পুরানো সিস্টেমকে বোঝায় এবং (খ) এটি পরিষ্কার করতে ব্যর্থ হয় যে আকারটি এক সিস্টেম থেকে অন্য সিস্টেমে পরিবর্তিত হবে। সি এর সেরা বইটি কার্নিগান এবং রিচি রচিত "দ্য সি প্রোগ্রামিং ল্যাঙ্গুয়েজ", যদিও এটি কিছু প্রোগ্রামিং অভিজ্ঞতা অনুমান করে। কমপ্লেক্স.এলএফএএইচএইউএর প্রশ্নাবলীর 18.10 প্রশ্নও দেখুন ।
কিথ থমসন

2
#define int int64_tএকটি 64-বিট প্ল্যাটফর্ম চেষ্টা করুন, তাই না। শুধু ব্যবহার sizeof। ;-)
নেটকোডার

উত্তর:


183

আমি জানি এটা সমান sizeof(int)। একটির আকারটি intসত্যই সংকলক নির্ভর। আগের দিন, প্রসেসরগুলি যখন 16 বিট intছিল , তখন 2 বাইট ছিল। আজকাল, এটি প্রায়শই 32-বিটের পাশাপাশি 64-বিট সিস্টেমে 4 বাইট হয়।

তবুও, sizeof(int)প্রোগ্রামটি কার্যকর করা নির্দিষ্ট সিস্টেমের জন্য একটি পূর্ণসংখ্যার আকার পাওয়ার সবচেয়ে ভাল উপায়।

সম্পাদনা: স্থির ভুল বক্তব্য যা intবেশিরভাগ on৪-বিট সিস্টেমে 8 বাইট। উদাহরণস্বরূপ, এটি 64-বিট জিসিসিতে 4 বাইট।


31
@ রাজীবপ্রথাপ: ঠিক আছে, এটি সংকলক-নির্ভর, তবে সংকলক সিদ্ধান্ত নেয় যে এটি মেশিন-নির্ভর কি না। :)
user541686

2
প্রিপ্রোকেসেসারের জন্য আপনার যদি আকারের প্রয়োজন হয় তবে আপনি INT_MAX এর মতো পূর্বনির্ধারিত ম্যাক্রোগুলি পরীক্ষা করতে পারেন। মানটি যদি আপনার কোড দ্বারা প্রত্যাশিত এক না হয় তবে বর্তমান সংকলক / প্ল্যাটফর্মের সংমিশ্রণে বুদ্ধির আকারের বাইট আকার আলাদা।
ওয়াল্ট বিক্রেতারা

3
এটি কেবল মেশিন নির্ভর নয়, এটি মেশিনে চলমান অপারেটিং সিস্টেমের উপরও নির্ভর করে। উদাহরণস্বরূপ উইন 64 এ লম্বা 4 বাইট যেখানে লিনাক্স 64 এ 8 বাইট দীর্ঘ।
কেম কল্যাঙ্কু

9
ভুল। সবচেয়ে 64 বিট সিস্টেমে int- এ এখনও 4 বাইট en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models
phuclv

7
sizeof(int)যে কোনও মান হতে পারে 1। একটি বাইট 8 বিট হওয়ার প্রয়োজন হয় না এবং কিছু মেশিনে 8 বিট অ্যাড্রেসনেবল ইউনিট থাকে না (যা মূলত স্ট্যান্ডার্ডের বাইটের সংজ্ঞা )। উত্তর আরও তথ্য ছাড়া সঠিক নয়।
এই সাইটের পক্ষে খুব সৎ

102

এটি সি এর একটি পয়েন্ট যা প্রথমে বিভ্রান্তিকর হতে পারে তবে সি স্ট্যান্ডার্ডটি কেবলমাত্র পূর্ণসংখ্যার প্রকারের জন্য ন্যূনতম পরিসীমা নির্দিষ্ট করে যা সমর্থনের গ্যারান্টিযুক্ত। int-32767 থেকে 32767 ধরে রাখতে সক্ষম হওয়ার গ্যারান্টিযুক্ত, যার জন্য 16 বিট দরকার। সেক্ষেত্রে, int, 2 বাইট। যাইহোক, বাস্তবায়নগুলি সর্বনিম্নের বাইরে চলে যেতে পারে, আপনি দেখতে পাবেন যে অনেক আধুনিক সংকলক int32-বিট তৈরি করেন (যার অর্থ 4 বাইটগুলিও বেশ সর্বব্যাপী)।

আপনার বইটি 2 বাইট বলার কারণ সম্ভবত এটি পুরানো। এক সময়, এটি ছিল আদর্শ। সাধারণভাবে, আপনি sizeofযখন প্ল্যাটফর্মটি ব্যবহার করছেন এটিতে কতটি বাইট রয়েছে তা খুঁজে বের করার প্রয়োজন থাকলে আপনার সর্বদা অপারেটরটি ব্যবহার করা উচিত ।

এটিকে সমাধান করতে, C99 নতুন প্রকার যুক্ত করেছে যেখানে আপনি স্পষ্টভাবে নির্দিষ্ট আকারের পূর্ণসংখ্যার জন্য জিজ্ঞাসা করতে পারেন, উদাহরণস্বরূপ int16_tবা int32_t। তার আগে, নির্দিষ্ট প্রস্থের পূর্ণসংখ্যা পাওয়ার কোনও সর্বজনীন উপায় ছিল না (যদিও বেশিরভাগ প্ল্যাটফর্মগুলি প্রতি প্ল্যাটফর্মের ভিত্তিতে একই ধরণের সরবরাহ করে)।


7
@ নতুনকরণ: দু'জনের পরিপূরক মেশিনে (যা আমি জানি প্রতিটি মেশিনই ...), হ্যাঁ। তবে, সি এটি হওয়ার নিশ্চয়তা দেয় না।
ফ্যাটাল এরর

@ নবীনতর আমি সি-তে সম্পূর্ণ নতুন, তবে এটি 32767 নয় কারণ অন্যথায় এটি আরেকটি বিট | বাইট ব্যবহার করবে? কল্পনা করুন, আমি 3 টি সংখ্যা (0 বা 1) ধরে রাখতে পারি, তাই আমি 000 থেকে 111 (যা দশমিক 7) যেতে পারি। An হ'ল 2 এর ব্যয়কারীর ঠিক আগে যদি আমি 8 (1000) পর্যন্ত যেতে পারি তবে আমি সেই 4 টি সংখ্যা 15 পর্যন্ত ব্যবহার করতে পারতাম! যেমন 32767 2 এর ঘাঁটাঘাঁটির ঠিক আগে, এটি সমস্ত বিটস | বাইট উপলব্ধ করে দেয় exha
আরজিএস

3
@ আর সেরেরও আমি কোনও সি বিশেষজ্ঞ নই তবে ইতিবাচক সংখ্যার জন্য এএফআইএকি এটি সর্বাধিক নেতিবাচক সংখ্যার চেয়ে কম। সুতরাং -8 থেকে 7, -256 থেকে 255 এবং আরও কিছু। নেতিবাচক সংখ্যাগুলি শূন্য গণনা করতে হবে না।
নেভান রাজা

1
"১ b বিটস that সেক্ষেত্রে ইনট 2 বাইট" ভুল হতে পারে, CHAR_BIT যদি 16 হয়, মাপ (ইনট) 1 বাইট (বা চর) হতে পারে।
12431234123412341234123

6
@ নতুনকরণ: কেবলমাত্র যদি আপনি স্বাক্ষরযুক্ত 2 টির পরিপূরক প্রতিনিধিত্ব অনুমান করেন int। সি যে অনুমান করে না। 1 এর পরিপূরক এবং সাইন-প্রস্থের সিস্টেমগুলি -3276816 বিটে উপস্থাপন করতে পারে না ; বরং শূন্যের জন্য তাদের দুটি উপস্থাপনা রয়েছে (ধনাত্মক এবং negativeণাত্মক)। কেন একটি ন্যূনতম পরিসীমা এটা intহয় [-32767..32767]
জন বোদে

33

এর নির্দিষ্ট কোনও উত্তর নেই। এটি প্ল্যাটফর্মের উপর নির্ভর করে। এটি বাস্তবায়ন সংজ্ঞায়িত হয়। এটি 2, 4 বা অন্য কিছু হতে পারে।

পিছনে ধারণাটি intছিল যে এটি প্রদত্ত প্ল্যাটফর্মে প্রাকৃতিক "শব্দ" আকারের সাথে মিলিত হবে: 16 বিট প্ল্যাটফর্মের উপর 16 বিট, 32-বিট প্ল্যাটফর্মের উপর 32 বিট, -৪-বিট প্ল্যাটফর্মে bit৪ বিট, আপনি ধারণা পাবেন। যাইহোক, পশ্চাদপটে সামঞ্জস্যের উদ্দেশ্যে কিছু সংকলক int64৪-বিট প্ল্যাটফর্মগুলিতে এমনকি 32-বিটে আটকে থাকতে পছন্দ করে ।

2-বাইট সময় intআপনি যদি 16-বিট শব্দের আকারের সাথে কিছু এম্বেডেড প্ল্যাটফর্ম ব্যবহার না করেন তবে (16-বিট প্ল্যাটফর্ম?) অনেক দিন চলে যায়। আপনার পাঠ্যপুস্তক সম্ভবত খুব পুরানো।


2
The idea behind int was that it was supposed to match the natural "word" size on the given platform- এই আমি খুঁজছিলাম। কোন ধারণা কি হতে পারে? একটি নিখরচায় পৃথিবীতে, মেমরির ডানদিকে কোনও ক্রমাগত বাইটগুলি সংখ্যক দখল করতে পারে? 8, 16 যাই হোক না কেন
ভোলাগব্বর

19

আপনি কোন প্ল্যাটফর্মটি ব্যবহার করছেন তার উপর এই প্রশ্নের উত্তর নির্ভর করে।
প্ল্যাটফর্ম নির্বিশেষে, আপনি নির্ভরযোগ্যভাবে নিম্নলিখিত ধরণের ধরে নিতে পারেন:

 [8-bit] signed char: -127 to 127
 [8-bit] unsigned char: 0 to 255
 [16-bit]signed short: -32767 to 32767
 [16-bit]unsigned short: 0 to 65535
 [32-bit]signed long: -2147483647 to 2147483647
 [32-bit]unsigned long: 0 to 4294967295
 [64-bit]signed long long: -9223372036854775807 to 9223372036854775807
 [64-bit]unsigned long long: 0 to 18446744073709551615

3
কেউ আপনার পোস্টকে "রেঞ্জ" ঠিক করার জন্য সম্পাদনা করেছে তবে আমি নিশ্চিত নই যে আপনার সম্পাদনাটি পর্যাপ্তভাবে আপনার অভিপ্রায় প্রতিফলিত করে কিনা। এটি দু'জনের পরিপূরক বাস্তবায়ন অনুমান করে, যা বেশিরভাগ ক্ষেত্রে সত্য হবে , তবে সবকটিই নয়। যেহেতু আপনার উত্তরটি কার্যকরভাবে প্রয়োগ-নির্ভরতা নির্দেশ করে, আমি ভাবছি সম্পাদনাটি সম্ভবত ভুল। আপনি যদি সম্মত হন তবে দয়া করে সম্পাদনাটি উল্টাতে ভুলবেন না।
কোডি ধূসর

1
@ k06a আপনার সম্পাদনা ভুল ছিল । আপনি নির্দিষ্টভাবে মূল পরিসীমাটিকে 2-পরিপূরক ব্যাপ্তিতে পরিবর্তন করেছেন - এগুলি সি স্ট্যান্ডার্ডে নির্দিষ্ট করা নয়
অ্যান্টি হাপালা

@ কোডি গ্রে এটি পিছনে পিছনে ওঠানামা করে চলেছে, গত 3 বছর ধরে 1 এর পরিপূরক অনুষঙ্গ হয়েছে এবং ওপি কিছুই বলছে না তাই আমি এমন একটি সম্পাদনা ফিরিয়ে দিলাম যা এটি "ফিক্স রেঞ্জ" এর সাথে 2 এর পরিপূরক হিসাবে পরিবর্তিত হয়েছে, যেহেতু এটি "আপনি নির্ভরযোগ্যভাবে ধরে নিতে পারেন" , যা এখনও ঠিক সত্য নয়।
অ্যান্টি হাপালা

13

সি-তে একটি পূর্ণসংখ্যা পরিবর্তনশীল 2 বাইট বা 4 বাইট দখল করে?

এটি আপনি যে প্ল্যাটফর্মটি ব্যবহার করছেন তার উপর নির্ভর করে পাশাপাশি আপনার সংকলকটি কীভাবে কনফিগার করা হয়েছে তা নির্ভর করে। একমাত্র অনুমোদিত উত্তরটি হ'ল sizeofঅপারেটরটি আপনার নির্দিষ্ট পরিস্থিতিতে কতটা পূর্ণসংখ্যার হয় তা দেখতে ব্যবহার করা।


এটি নির্ভর করে কিসের কারণগুলি?

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


sizeof, বাইট এবং CHAR_BIT

সি স্ট্যান্ডার্ড (উপরের সাথে সংযুক্ত) থেকে নেওয়া নিম্নলিখিত বিবৃতিটি এটিকে এমন কথায় বর্ণনা করে যা আমি মনে করি না যে এটির উন্নতি হতে পারে।

sizeofঅপারেটর তার প্রতীক এর আকার (বাইটে), যা একটি অভিব্যক্তি বা ধরনের আলাদা নাম হতে পারে উৎপাদ। আকারটি অপারেন্ডের ধরণ থেকে নির্ধারিত হয়।

একটি পরিষ্কার বোঝা ধরে নেওয়া আমাদের বাইটস সম্পর্কে আলোচনার দিকে পরিচালিত করবে । এটি সাধারণত অনুমান করা হয় যে একটি বাইট আট বিট হয়, যখন বাস্তবে CHAR_BITআপনাকে বলে যে বাইটে কত বিট রয়েছে । এটি কেবল সেই দুটি সূক্ষ্মতার মধ্যে একটি যা সাধারণ দুটি (বা চার) বাইট সংখ্যার কথা বলার সময় বিবেচনা করা হয় না ।

এখন পর্যন্ত জিনিসগুলি গুটিয়ে রাখা যাক:

  • sizeof => আকার বাইট, এবং
  • CHAR_BIT => বাইটে বিটের সংখ্যা

সুতরাং, আপনার সিস্টেম উপর নির্ভর করে, sizeof (unsigned int)হতে পারে কোন তুলনায় মান বৃহত্তর শূন্য (শুধুমাত্র 2 বা 4), হিসাবে যদি CHAR_BIT16 হয়, তাহলে একটি একক (ষোল-বিট) বাইট এটা যথেষ্ট বিট ষোল বিট পূর্ণসংখ্যা দ্বারা বর্ণিত প্রতিনিধিত্ব করতে হয়েছে মান (নীচে উদ্ধৃত) এটি প্রয়োজনীয়ভাবে দরকারী তথ্য নয়, তাই না? আসুন আরও গভীরভাবে ...


পূর্ণসংখ্যার উপস্থাপনা

সি মান নির্দিষ্ট করে সব মান পূর্ণসংখ্যা ধরনের (এবং ন্যূনতম স্পষ্টতা / ব্যাপ্তি CHAR_BIT, খুব, fwiw) এখানে । এর থেকে, মানটি সংরক্ষণের জন্য কত বিট প্রয়োজন তার জন্য আমরা একটি ন্যূনতম অর্জন করতে পারি , তবে আমরা কেবলমাত্র রেঞ্জের উপর ভিত্তি করে আমাদের ভেরিয়েবলগুলি বেছে নিতে পারি । তবুও, এই উত্তরের জন্য প্রয়োজনীয় বিশদের একটি বিশাল অংশ এখানেই রয়েছে। উদাহরণস্বরূপ, নিম্নলিখিত যে স্ট্যান্ডার্ডটির জন্য (কমপক্ষে) ষোল বিট স্টোরেজ প্রয়োজন:unsigned int

UINT_MAX                                65535 // 2¹⁶ - 1

সুতরাং আমরা দেখতে পাচ্ছি যে unsigned int( কমপক্ষে ) ১ b বিট লাগবে , যেখানে আপনি দুটি বাইট পাবেন (ধরে নেওয়া CHAR_BITহয় 8) এবং পরে যখন এই সীমাটি বৃদ্ধি পেয়েছিল তখন 2³² - 1লোকেরা তার পরিবর্তে 4 বাইট বানাচ্ছিল। এটি আপনি যে ঘটনাটি লক্ষ্য করেছেন তা ব্যাখ্যা করে:

বেশিরভাগ পাঠ্যপুস্তক বলে যে পূর্ণসংখ্যার ভেরিয়েবলগুলি 2 বাইট দখল করে। তবে আমি যখন একটি প্রোগ্রাম পরিচালনা করি যখন একটি পূর্ণসংখ্যার অ্যারের ক্রমাগত ঠিকানাগুলি মুদ্রণ করা হয় তখন এটি 4 এর পার্থক্য দেখায়।

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

মান বিটগুলি সাধারণ ভুল ধারণাগুলি গণনা করা বলে মনে হয়। উপরের উদাহরণটিতে একটি unsignedপূর্ণসংখ্যা টাইপ ব্যবহার করা হয় যার মধ্যে সাধারণত মূল্য মান বিট থাকে তাই বিশদে শয়তানটিকে মিস করা সহজ।

বিটগুলি সাইন করুন ... উপরের উদাহরণে আমি UINT_MAXউপরের সীমা হিসাবে উদ্ধৃত করেছি unsigned intকারণ এটি 16মন্তব্য থেকে মানটি বের করা একটি তুচ্ছ উদাহরণ । স্বাক্ষরিত ধরণেরগুলির জন্য, ইতিবাচক এবং নেতিবাচক মানগুলির মধ্যে পার্থক্য করতে (এটিই সাইন), আমাদের সাইন বিটটিও অন্তর্ভুক্ত করতে হবে।

INT_MIN                                -32768 // -(2¹⁵)
INT_MAX                                +32767 // 2¹⁵ - 1

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


যেমন আপনি দেখতে পাচ্ছেন, মানকটি পূর্ণসংখ্যার প্রকারগুলি বেছে নেওয়ার সময় মানদণ্ডের মতো INT_MIN.. INT_MAXএবং অন্যান্য ন্যূনতম / সর্বাধিক মানগুলি বিবেচনা করতে উত্সাহিত করে এবং মাপের উপর নির্ভর করে নিরুৎসাহিত করে কারণ অন্যান্য সূক্ষ্ম কারণগুলি যেমন ভুলে যাওয়ার সম্ভাবনা রয়েছে যেমন CHAR_BITবিড এবং প্যাডিং বিটগুলি এর মানকে প্রভাবিত করতে পারে sizeof (int)(অর্থাত্ দ্বি-বাইট এবং চার-বাইট পূর্ণসংখ্যার সাধারণ ভুল ধারণা এই বিবরণগুলিকে অবহেলা করে)।


13

C99 N1256 স্ট্যান্ডার্ড খসড়া

http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf

আকার intএবং অন্যান্য সমস্ত ধরণের ধরণের বাস্তবায়ন সংজ্ঞায়িত করা হয়, C99 কেবলমাত্র নির্দিষ্ট করে:

  • ন্যূনতম আকার গ্যারান্টি
  • প্রকারের মধ্যে আপেক্ষিক আকার

5.2.4.2.1 "পূর্ণসংখ্যার ধরণের আকার <limits.h> আকার" সর্বনিম্ন মাপ দেয়:

1 [...] তাদের বাস্তবায়ন-সংজ্ঞায়িত মানগুলি দেখানো ব্যক্তিদের সমান বা বৃহত্তর (নিখুঁত মান) হতে হবে [...]

  • UCHAR_MAX 255 // 2 8 - 1
  • USHRT_MAX 65535 // 2 16 - 1
  • UINT_MAX 65535 // 2 16 - 1
  • উলং_ম্যাক্স 4294967295 // 2 32 - 1
  • উল্লং_ম্যাক্স 18446744073709551615 // 2 64 - 1

6.2.5 "প্রকারগুলি" তারপরে বলে:

8 একই স্বাক্ষর এবং বিভিন্ন পূর্ণসংখ্যার রূপান্তর র‌্যাঙ্কের সাথে কোনও দুটি পূর্ণসংখ্যার ধরণের (6.3.1.1 দেখুন), ছোট পূর্ণসংখ্যার রূপান্তর র‌্যাঙ্কের সাথে প্রকারের মানগুলির পরিসীমা হ'ল অন্য ধরণের মানগুলির একটি সুবস্তু।

এবং 6.3.1.1 "বুলিয়ান, অক্ষর এবং পূর্ণসংখ্যার" আপেক্ষিক রূপান্তর স্থান নির্ধারণ করে:

1 প্রতিটি পূর্ণসংখ্যার ধরণটির সংজ্ঞা হিসাবে সংজ্ঞা দেওয়া হয়:

  • লম্বা লম্বা ইন্টের র‌্যাঙ্ক লং ইন্টের র‌্যাঙ্কের চেয়ে বেশি হবে, যা ইনট র‌্যাঙ্কের চেয়ে বেশি হবে, যা স্বল্প ইনট র‌্যাঙ্কের চেয়ে বেশি হবে, যা স্বাক্ষরিত চরের মাপের চেয়ে বেশি হবে।
  • যেকোন স্বাক্ষরযুক্ত পূর্ণসংখ্যার ধরণের রেঙ্কটি সংশ্লিষ্ট স্বাক্ষরিত পূর্ণসংখ্যার ধরণের সমান হবে, যদি থাকে তবে।
  • সমস্ত পূর্ণসংখ্যার প্রকারের জন্য টি 1, টি 2, এবং টি 3, যদি টি 1 টি টি 2 এর চেয়ে বেশি এবং টি 2 টি টি -3 এর চেয়ে বেশি হয় তবে টি 1 টি টি 3 এর চেয়ে বেশি র‌্যাঙ্ক রাখে

8

শুধুমাত্র গ্যারান্টী আছে charহতে হবে কমপক্ষে 8 বিট চওড়া, shortএবং intহতে হবে কমপক্ষে 16 বিট চওড়া ও longহতে হবে কমপক্ষে 32 বিট প্রশস্ত, এবং যে sizeof (char)<= sizeof (short)<= sizeof (int)<= sizeof (long)(একই ঐ ধরনের স্বাক্ষরবিহীন সংস্করণের জন্য সত্য )।

int প্ল্যাটফর্মের উপর নির্ভর করে 16 থেকে 64 বিট প্রশস্ত যে কোনও জায়গায় হতে পারে।


6

সি “ইনট” 2 বাইট বা 4 বাইটের আকার?

উত্তরটি "হ্যাঁ" / "না" / "সম্ভবত" / "সম্ভবত নাও"।

সি প্রোগ্রামিং ল্যাঙ্গুয়েজটি নিম্নলিখিতটি নির্দিষ্ট করে: ক্ষুদ্রতম ঠিকানাযোগ্য ইউনিট, যা পরিচিত charএবং "বাইট" নামে পরিচিত , একেবারে CHAR_BITবিট বিস্তৃত, যেখানেCHAR_BIT কমপক্ষে 8 8

সুতরাং, সি-তে একটি বাইট অষ্টেটের অগত্যা 8 বিট নয়। অতীতে সি কোড চালানোর জন্য প্রথম প্ল্যাটফর্মগুলির মধ্যে একটিতে (এবং ইউনিক্স) 4-বাইট ছিল int- তবে মোট intছিল 36 বিট, কারণ CHAR_BIT9!

intপ্ল্যাটফর্মটির জন্য প্রাকৃতিক পূর্ণসংখ্যার আকার হতে পারে যা অন্তত-32767 ... 32767 পরিসীমা রয়েছে । আপনি intপ্ল্যাটফর্মের বাইটগুলির সাথে আকারটি পেতে পারেন sizeof(int); আপনি যখন এই মানটি দ্বারা গুণ করবেন তখন আপনি CHAR_BITজানবেন যে এটি বিটগুলিতে কত প্রশস্ত।


৩ 36-বিট মেশিন বেশিরভাগ মৃত অবস্থায়, এখনও অ-8-বিট বাইট সহ প্ল্যাটফর্ম রয়েছে। গতকাল একটি টেক্সাস ইনস্ট্রুমেন্টস এমসিইউ সম্পর্কে 16 বিট বাইট সহ একটি প্রশ্ন ছিল , এটিতে C99, সি 11-অনুবর্তী সংকলক রয়েছে।

উপর TMS320C28x এটা মনে হচ্ছে যে char, shortএবং intহয় সব 16 বিটের চওড়া, এবং অত: পর এক বাইট। long int2 বাইট এবং long long int4 বাইট হয়। সি এর সৌন্দর্য হ'ল যে কোনও এখনও এই জাতীয় প্ল্যাটফর্মের জন্য একটি কার্যকর প্রোগ্রাম লিখতে পারে এবং এমনকি এটি বহনযোগ্য পদ্ধতিতেও করতে পারে!


"কারণ CHAR_BIT ছিল 9!" - তখন তাদের কাছে 362880 বিট কম্পিউটিং ছিল !? চিত্তাকর্ষক।
জোশ ডেসমন্ড

5

প্রায় এটা প্ল্যাটফর্ম আপনাকে .এটা ব্যবহার করছেন তার উপর নির্ভর করে কম্পাইলার অধিকাংশ compiler.Nowadays করতে কম্পাইলার থেকে নির্ভর করে int- এ হয় 4 বাইট । আপনার সংকলকটি কী ব্যবহার করছে তা আপনি যদি পরীক্ষা করতে চান তবে আপনি ব্যবহার করতে পারেন sizeof(int)

main()
{
    printf("%d",sizeof(int));
    printf("%d",sizeof(short));
    printf("%d",sizeof(long));
}

সি কম্পাইলারের কেবলমাত্র প্রতিশ্রুতিটি হ'ল সংক্ষিপ্ত আকারের সমান বা ইন্টের চেয়ে কম হতে হবে এবং দীর্ঘের আকার অবশ্যই ইন্টের চেয়ে সমান বা বেশি হতে হবে o সুতরাং যদি ইন্টের আকার 4 হয় তবে সংক্ষিপ্ত আকার 2 বা 4 তবে বড় নয় যে তুলনায় একই একই দীর্ঘ এবং int জন্য সত্য। এটি আরও বলেছে যে সংক্ষিপ্ত এবং দীর্ঘের আকার একই হতে পারে না।


1
ব্যবহার %dএকটি জন্য size_tপ্যারামিটার UB হয়।
পল আর

3

এটি বাস্তবায়নের উপর নির্ভর করে, তবে সাধারণত x86 এবং অন্যান্য জনপ্রিয় আর্কিটেকচারে এআরএম intএর 4 বাইট লাগে। আপনি সবসময় সংকলনের সময় ব্যবহার করে পরীক্ষা করতে পারেনsizeof(int) বা অন্য যে কোনও ধরণের যাচাই করতে চান তা পরীক্ষা করতে পারেন।

আপনি যদি নিশ্চিত করতে চান যে আপনি কোনও নির্দিষ্ট আকারের এক প্রকারের ব্যবহার করছেন তবে প্রকারের প্রকারটি ব্যবহার করুন <stdint.h>


2
#include <stdio.h>

int main(void) {
    printf("size of int: %d", (int)sizeof(int));
    return 0;
}

এটি 4 ফেরত দেয় তবে এটি সম্ভবত মেশিন নির্ভর।


1

সি “ইনট” 2 বাইট বা 4 বাইটের আকার?

সি-তে একটি পূর্ণসংখ্যা পরিবর্তনশীল 2 বাইট বা 4 বাইট দখল করে?

সি "বাইটস" প্রতি "বাইট" 8 বিট ব্যতীত অন্য কিছু হতে দেয়।

CHAR_BIT ক্ষুদ্রতম বস্তুর জন্য বিটের সংখ্যা যা বিট-ফিল্ড নয় (বাইট) C11dr §5.2.4.2.1 1

8 এর চেয়ে বেশি কোনও কিছুর মান ক্রমবর্ধমান অস্বাভাবিক। সর্বাধিক বহনযোগ্যতা জন্য, ব্যবহার CHAR_BITবদলে 8. একটি আকার intমধ্যে বিট সি হল sizeof(int) * CHAR_BIT

#include <limits.h>
printf("(int) Bit size %zu\n", sizeof(int) * CHAR_BIT);

এটি নির্ভর করে কিসের কারণগুলি?

intবিট আকার সাধারণভাবে 32 বা 16 বিট। সি নির্দিষ্ট ন্যূনতম ব্যাপ্তি :

int INT_MINটাইপযুক্ত কোনও বস্তুর জন্য ন্যূনতম মান -32767 C11dr
টাইপের কোনও বস্তুর সর্বাধিক মান §5.2.4.2.1 1int INT_MAX

ন্যূনতম পরিসীমা জন্য intবাহিনী বিট হতে সাইজ লাগে কমপক্ষে 16 - এমনকি প্রসেসর ছিল "8-বিট"। বিশেষত প্রসেসরগুলিতে 64 বিটের মতো আকার দেখা যায়। 18, 24, 36, ইত্যাদির মতো অন্যান্য মান historicতিহাসিক প্ল্যাটফর্মগুলিতে দেখা গিয়েছে বা কমপক্ষে তাত্ত্বিকভাবে সম্ভব। আধুনিক কোডিং খুব কমই 2- intবিট-আকারের বিট মাপ নিয়ে উদ্বেগ করে।

কম্পিউটারের প্রসেসর এবং আর্কিটেকচার intবিট সাইজ নির্বাচন চালায় ।

তবুও 64৪-বিট প্রসেসরের সাথেও, কম্পাইলারের intআকারটি সামঞ্জস্যতার কারণে 32-বিট হতে পারে কারণ বড় কোড intবেসগুলি 32-বিট (বা 32/16) হওয়ার উপর নির্ভর করে ।


-1

এই প্রশ্নের উত্তর দেওয়ার জন্য এটি একটি ভাল উত্স।

তবে এই প্রশ্নটি একধরনের সত্যের উত্তর, "হ্যাঁ। উভয়ই।"

এটি আপনার আর্কিটেকচারের উপর নির্ভর করে। আপনি যদি 16-বিট মেশিনে বা তারও কম কাজ করতে চলেছেন তবে এটি 4 বাইট (= 32 বিট) হতে পারে না। আপনি যদি 32-বিট বা আরও ভাল মেশিনে কাজ করছেন তবে এর দৈর্ঘ্য 32-বিট।

বের করার জন্য, আপনার পাঠ্যযোগ্য কিছু আউটপুট দেওয়ার জন্য প্রোগ্রাম প্রস্তুত করুন এবং "মাপের" ফাংশনটি ব্যবহার করুন। এটি আপনার ঘোষিত ডেটাটাইপের বাইটে আকার দেয়। তবে অ্যারে দিয়ে এটি ব্যবহার করে কারফুল হন।

আপনি যদি ঘোষণা দিচ্ছেন তবে int t[12];এটি 12 * 4 বাইট ফিরে আসবে। এই অ্যারের দৈর্ঘ্য পেতে, কেবল ব্যবহার করুন sizeof(t)/sizeof(t[0])। আপনি যদি কোনও ফাংশন তৈরি করতে যাচ্ছেন তবে এটি কোনও প্রেরণের অ্যারের আকার গণনা করা উচিত, মনে রাখবেন যে যদি

typedef int array[12];
int function(array t){
    int size_of_t = sizeof(t)/sizeof(t[0]);
    return size_of_t;
}
void main(){
    array t = {1,1,1};  //remember: t= [1,1,1,0,...,0]
    int a = function(t);    //remember: sending t is just a pointer and equal to int* t
   print(a);   // output will be 1, since t will be interpreted as an int itselve. 
}

সুতরাং এটি এমনকি অন্য কিছু ফিরে আসবে না। আপনি যদি একটি অ্যারে সংজ্ঞায়িত করেন এবং দৈর্ঘ্যটি পরে পাওয়ার চেষ্টা করেন তবে মাপের ব্যবহার করুন। যদি আপনি কোনও ফাংশনে অ্যারে প্রেরণ করেন তবে মনে রাখবেন প্রেরণ মানটি প্রথম উপাদানটির কেবলমাত্র একটি পয়েন্টার। তবে এক ক্ষেত্রে, আপনি সর্বদা জানেন যে আপনার অ্যারের আকারটি কী। কেস টু দুটি ফাংশন সংজ্ঞায়িত করে কিছু কর্মক্ষমতা মিস করে। ফাংশন (অ্যারে টি) সংজ্ঞায়িত করুন এবং ফাংশন 2 (অ্যারে টি, int আকার_of_t) সংজ্ঞায়িত করুন। "ফাংশন (টি)" কল করুন কিছু অনুলিপি-কাজের মাধ্যমে দৈর্ঘ্য পরিমাপ করুন এবং ফাংশন 2 এ ফলাফলটি প্রেরণ করুন, যেখানে আপনি ভেরিয়েবল অ্যারে-আকারে যা খুশি করতে পারেন।


প্রদত্ত লিঙ্কটি তথ্যের একটি খারাপ উত্স কারণ এটি এমন জিনিস ধরে নেয় যা সবসময় সত্য হয় না (যেমন charসর্বদা সর্বদা signed)
আন্দ্রে ড্যামিয়ান-ফেকেট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.