মেশিনগুলি কি আছে, যেখানে আকার (চর)! = 1, বা কমপক্ষে CHAR_BIT> 8?


93

মেশিন আছে (বা সংকলক), কোথায় sizeof(char) != 1?

সি 99 স্ট্যান্ডার্ড কি বলে যে sizeof(char)স্ট্যান্ডার্ড কমপ্লায়েন্স বাস্তবায়নের ক্ষেত্রে হুবহু 1 হওয়া উচিত? যদি তা হয় তবে দয়া করে আমাকে বিভাগের নম্বর এবং উদ্ধৃতি দিন।

আপডেট: আমার কাছে যদি এমন একটি মেশিন থাকে (সিপিইউ), যা বাইটসকে সম্বোধন করতে পারে না (ন্যূনতম পঠনটি 4 বাইট, প্রান্তিককরণ), তবে কেবল 4-এস বাইটস ( uint32_t), এই মেশিনটির সংকলক sizeof(char)4 সংজ্ঞায়িত করতে পারে? sizeof(char)1 টি হবে তবে চরের 32 টি বিট থাকবে ( CHAR_BITম্যাক্রোগুলি)

আপডেট 2: তবে আকারের ফলাফল কোনও বাইটিস নয়! এটি CHAR এর আকার। এবং চর 2 বাইট, বা (বিট) 7 বিট হতে পারে?

আপডেট 3: ঠিক আছে। সমস্ত মেশিন আছে sizeof(char) == 1। তবে কি মেশিন আছে CHAR_BIT > 8?


4
আমি C99 স্ট্যান্ডার্ড-কমপ্লায়েন্সে চিন্তিত। আমি সি 99
সংকলকগুলির

4
ইউনিকোড আরও গুরুত্বপূর্ণ হয়ে ওঠার সাথে সাথে এমন কিছু মানক সংকলক আসতে পারে যা ইউনিকোড অক্ষর হিসাবে ব্যবহার করে char(পরিবর্তে wchar।) এমনকি যদি মানটি sizeof(char)1 হিসাবে অবশ্যই বলে থাকে তবে আমি এই ধারণার উপর নির্ভর করব না।
চিপ উনি

14
মাপের (চর) 1, ইউনিকোড বা না নেই এমন কোনও সি সংকলক নেই।
নম্বর

6
@ শিপ: sizeof(char)সর্বদা 1, এমনকি চর 32-বিট হলেও (কিছু সিস্টেমে যেমন হয়)। সিতে প্রচুর মজাদার ওয়ার্ট রয়েছে।
নিক বেস্টিন

4
সি স্ট্যান্ডার্ডের সমস্ত সংস্করণে CHAR_BIT কমপক্ষে 8 হওয়া দরকার; আপনার CHAR_BIT == 7 থাকতে পারে না এবং মান সম্মত হতে পারেন। যাইহোক, এটা পুরোপুরি সম্ভবপর হয় মেশিন CHAR_BIT নিজের কাছে> 8. প্রাচীন Cray মেশিন করেনি, আমি বিশ্বাস করি ( sizeof(char) == sizeof(short) && sizeof(char) == sizeof(int)ঐ উপর আমি মনে করতে পারছি না কিনা sizeof(int) == sizeof(long)অথবা CHAR_BIT 32 বা 64 ছিল; আমি আশা এটা 32 ছিল, এবং আমি মনে করি sizeof(long) == 1খুব। (আপনি ক্রে সি ম্যানুয়ালটিতে অনলাইনে অ্যাক্সেস না পেয়ে রেফারেন্স পেতে পারেন )
জোনাথন লেফলার

উত্তর:


91

এটি সর্বদা সি 99 এর এক, বিভাগ 6.5.3.4 এ:

যখন এমন অপারেন্ডে প্রয়োগ করা হয় যেখানে টাইপ চর, স্বাক্ষরবিহীন চর, বা স্বাক্ষরিত চর, (বা এর কোনও যোগ্য সংস্করণ) থাকে তবে ফলাফলটি 1 হয়।

সম্পাদনা করুন: আপনার প্রশ্নের অংশ নয়, তবে হার্বিসন এবং স্টিলের তৃতীয় সংস্করণের আগ্রহের জন্য। (প্রাক c99) পি। 148:

একটি স্টোরেজ ইউনিট একটি অক্ষর দ্বারা দখলকৃত স্টোরেজের পরিমাণ হিসাবে নেওয়া হয়; প্রকারের কোনও বস্তুর আকার charতাই 1।

সম্পাদনা করুন: আপনার আপডেট হওয়া প্রশ্নের উত্তরে হার্বিসন এবং স্টিলের নিম্নলিখিত প্রশ্ন ও উত্তর প্রাসঙ্গিক (আইবিড, ছ। Of এর প্রাক্তন ৪):

কোন ধরণের কী char-2,147,483,648 থেকে 2,147,483,647 এর মধ্যে মূল্যবোধ উপস্থাপন করতে পারে এমন কোনও সি বাস্তবায়ন অনুমোদিত ? যদি তা হয় তবে sizeof(char) সেই বাস্তবায়নের অধীনে কী হবে ? প্রকারের ক্ষুদ্রতম ও বৃহত্তম পরিসীমাটি কী হবে int?

উত্তর (আইবিড, পৃষ্ঠা 382):

এটা তোলে অনুমতি দেওয়া হয় (যদি অযথা) একটি বাস্তবায়ন 32 বিট ব্যবহার করতে টাইপ প্রতিনিধিত্ব করার জন্য char। বাস্তবায়ন নির্বিশেষে, এর মান sizeof(char)সর্বদা 1 হয়।

যদিও এটি কোনও ক্ষেত্রে সুনির্দিষ্টভাবে মোকাবেলা করে না যেখানে বলুন বাইটগুলি 8 বিট এবং charসেই 4 বাইটগুলির মধ্যে 4 (সত্যিকার অর্থে সি 99 এর সংজ্ঞা দিয়ে অসম্ভব, নীচে দেখুন), এই ঘটনাটি sizeof(char) = 1সর্বদা সি 99 স্ট্যান্ডার্ড এবং হার্বিসন এবং স্টিল থেকে স্পষ্ট।

সম্পাদনা: আসলে (এটি আপনার upd 2 প্রশ্নের জবাবে হয়), যতটা C99 সংশ্লিষ্ট হয় sizeof(char) হয় , বাইটে অধ্যায় 6.5.3.4 আবার থেকে:

আকারের অপারেটর তার অপারেন্ডের আকার (বাইটে) দেয়

সুতরাং উপরের উদ্ধৃতিটির সাথে মিলিয়ে 8 টি বিট এবং char4 টি বাইট হিসাবে বাইট অসম্ভব: সি 99 এর জন্য একটি বাইট এক হিসাবে সমান char

আপনার 7 বিটের সম্ভাবনার উল্লেখের উত্তরে char: c99 এ এটি সম্ভব নয়। স্ট্যান্ডার্ডের 5.2.4.2.1 বিভাগ অনুযায়ী সর্বনিম্ন 8:

তাদের প্রয়োগ-সংজ্ঞায়িত মানগুলি একই চিহ্ন সহ দেখানোগুলির আকারের সমান বা বৃহত্তর [আমার জোর] হবে।

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

- টাইপ স্বাক্ষরিত অক্ষরের একটি সামগ্রীর জন্য সর্বনিম্ন মান

- স্বাক্ষরিত চরের প্রকারের একটি সামগ্রীর সর্বাধিক মান

- স্বাক্ষরবিহীন চরের প্রকারের অবজেক্টের সর্বাধিক মান

- টাইপ চরের কোনও সামগ্রীর জন্য সর্বনিম্ন মান

- টাইপ চরের কোনও অবজেক্টের সর্বাধিক মান

[...]

অভিব্যক্তিতে ব্যবহৃত টাইপের চরের বস্তুর মান যদি স্বাক্ষরিত পূর্ণসংখ্যার হিসাবে বিবেচনা করা হয়, CHAR_MIN এর মান SCHAR_MIN এর সমান এবং CHAR_MAX এর মান SCHAR_MAX এর সমান হবে। অন্যথায়, CHAR_MIN এর মান 0 হবে এবং CHAR_MAX এর মান UCHAR_MAX এর সমান হবে। UCHAR_MAX মান 2 ^ CHAR_BIT - 1 এর সমান হবে।


9
অতিরিক্ত নোট। একটি CHAR_BITS ম্যাক্রো রয়েছে যা আপনাকে জানায় যে আপনার চরগুলি কত বিট।
নম্বর

4
এই দুর্দান্ত বইয়ের সম্পূর্ণ ডেটা হরবিসন এবং স্টিলের। সি: একটি রেফারেন্স ম্যানুয়াল, তৃতীয় সংস্করণ,
প্রিন্টাইস

4
আপনি যদি জানেন যে আপনি চরের ধরণের সাথে কাজ করছেন এবং আপনি জানেন যে ভাষাটির জন্য তাদের 1 টি আকারের প্রয়োজন হয় তবে সর্বদা অপ্রয়োজনীয় আকার (চর) রাখাই কেন ভাল ধারণা?

4
(ক) এবং (গ) আরও অনেক গুরুতর পদক্ষেপ রয়েছে যা এটি সমাধানের আশা করতে পারে না, বা সমাধানের কাছাকাছি যেতে পারে না; এছাড়াও YAGNI। (খ) এর মতো কাউকে কেবল একবার বলা দরকার --- আমার কোডের প্রতিটি লাইনে এগুলি শেখানোর দরকার নেই। তবে, ব্যবহারে কিছু ত্রুটি রয়েছে sizeof(char): এটি বিতর্ক / চেক / ইত্যাদি ক্ষেত্রে অন্য আইটেম। আপনার কোডিং কনভেনশনস / স্ট্যান্ডার্ড / গাইডলাইনগুলিতে, আমার সময় নষ্ট করে ভাবছে আপনি সত্যই সি জানেন এবং অন্যটি কী হতে পারে তা ভিজ্যুয়াল / মানসিক / পাঠ্য-লাইন "ব্যান্ডউইথ" গ্রহণ করে।

4
@ রামশালঙ্কা: হ্যাঁ, সংকলিত কোডটি সমান। এটি পাঠযোগ্যতার চারপাশের সমস্ত বিষয় এবং অন্যথায় লোকেরা কীভাবে আমি যে উত্স কোডটি নিয়ে কথা বলছি তা ব্যবহার করে। (এবং এফডাব্লুআইডাব্লু, আমি মনে করি যে এখানে আপনার একটি ভাল +1 উত্তর রয়েছে, আমি কেবল ভুল পথে চালিত হতে "সর্বদা মাপের (চর)" ব্যবহার করি এবং একটি ছোট সমস্যা হলেও আমার কাছে হটবটন ইস্যুটি খুঁজে পাই)))

21

sizeof(char)4 যেখানে নেই এমন কোনও মেশিন নেই It's এটি সর্বদা 1 বাইট। এই বাইটে 32 টি বিট থাকতে পারে তবে সি সংকলকের হিসাবে এটি একটি বাইট। আরও বিশদের জন্য, আমি আসলে আপনাকে C ++ FAQ 26.6 এ নির্দেশ করব । এই লিঙ্কটি এটি বেশ ভালভাবে কভার করে এবং আমি মোটামুটি নির্দিষ্ট সি ++ সি থেকে এই সমস্ত নিয়ম পেয়েছি আপনি 8 বিটের চেয়ে বড় অক্ষরের জন্য কমপ্লেং.এল.এল.সি.এইউ.এইকিউ 8.10 দেখতে পারেন

আপডেট 2: তবে আকারের ফলাফল কোনও বাইটিস নয়! এটি CHAR এর আকার। এবং চর 2 বাইট, বা (বিট) 7 বিট হতে পারে?

হ্যাঁ, এটি বাইট আবার বলি। sizeof(char)সি সংকলক অনুযায়ী 1 বাইট হয়। লোকে কথোপকথনে যে বাইট (8 বিট) ডাকে সেগুলি অবশ্যই সি সংকলককে বাইট বলে বলে সমান নয়। সি বাইটে বিটের সংখ্যা আপনার মেশিনের আর্কিটেকচারের উপর নির্ভর করে পরিবর্তিত হয়। এটি কমপক্ষে 8 হওয়ারও গ্যারান্টিযুক্ত।


4
অনুগ্রহ!!! সি ++ হ'ল সি (সি 99) থেকে সত্যই ভিন্নতর ভাষা। এই প্রশ্নটি কেবল প্লেইন সি সম্পর্কে।
osgx

<স্ট্রাইক> মেশিন / সিপিইউ 8-বিট বাইট অ্যাক্সেস করতে না পারলে আমি কী করতে পারি? স্বাক্ষরবিহীন অ্যাক্সেস নিষিদ্ধ। </ স্ট্রাইক> (এমনকি x86 ম্যালোক প্রান্তিকিত ডেটা ফেরত দেয় এবং 4 বাইটের গুণায় মেমরি বরাদ্দ করে)) <স্ট্রাইক> তারপরে CHAT_BIT 8 এর চেয়ে বেশি হবে Yes হ্যাঁ, এই জাতীয় প্ল্যাটফর্ম বরং বিশেষ হতে পারে <</ স্ট্রাইক >
osgx

11
@osgx, লোকেরা সি এবং সি ++ মিশ্রিত করার চেষ্টা করার সময় আমি ঠিক তেমনি চিৎকার করেছি। কিন্তু আমি মনে করি এই ক্ষেত্রে যে এক সি ++ প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী এন্ট্রি সি জন্যও একইভাবে প্রযোজ্য
মাইকেল Kristofik

4
"8 বিট" এর সঠিক নাম অক্টেট। সি স্ট্যান্ডার্ডটি একটি বস্তুর জন্য "বাইট" শব্দটি ব্যবহার করে যা একটি চরের আকার। অন্যেরা "বাইট" শব্দটি বিভিন্ন উপায়ে ব্যবহার করতে পারেন, প্রায়শই যখন তাদের "অক্টেট" অর্থ হয় তবে সি (এবং সি ++, বা উদ্দেশ্য-সি) এর অর্থ "চরের আকার অবজেক্ট" থাকে। একটি চর 8 বিট বা এককোটের বেশি হতে পারে তবে এটি সর্বদা এক বাইট।
gnasher729

9

পিডিপি -10 এবং পিডিপি -11 ছিল।

আপডেট: পিডিপি -10 এর জন্য কোনও সি 99 সংকলক নেই।

অ্যানালগ ডিভাইসগুলির কয়েকটি মডেলের 32-বিট SHARC ডিএসপিতে CHAR_BIT = 32 রয়েছে, এবং TMS32F28xx এর টেক্সাস ইনস্ট্রুমেন্টসের ডিএসপি CHAR_BIT = 16 রয়েছে বলে জানা গেছে

আপডেট: CHAR_BIT = 9 সহ পিডিপি -10 এর জন্য জিসিসি 3.2 রয়েছে (সেই সংরক্ষণাগারটিতে অন্তর্ভুক্ত / সীমাবদ্ধতা পরীক্ষা করুন)।


4
সি-তে অনুরূপ-তবে-নয়-সি ভাষার প্রয়োগগুলি গুলিয়ে ফেলবেন না আপনি এমনকি বলেছিলেন "আমি C99 স্ট্যান্ডার্ড-কমপ্লায়েন্সে উদ্বিগ্ন। আমি সি 99 সংকলকগুলির সাথে ঘনিষ্ঠভাবে কাজ করি।"

4
@ রোজার: আপনি যদি চূড়ান্ত প্রান্তের মামলাগুলি জিসিসিতে ব্যাগ হিসাবে বিবেচিত না হয়ে থাকেন তবে আপনি যদি না জিসিসি 3 কে সি 99 বলে অভিযুক্ত না বলে উপযুক্ত না।
জোশুয়া

4
@ জোশুয়া, আমি মনে করি কে ওআরআর এবং পিসিসি historicতিহাসিক সংকলক সম্পর্কে রজার বলেছেন। এছাড়াও এই বন্দরটি সংকলন করার সাথে সাথে PD99-10-এ C99 সম্মতি পরীক্ষা-নিরীক্ষা চালানোর আগে C99 এর উপযুক্ত দাবি করা ঠিক হবে না (পোর্টিং থেকে এবং মেশিনে নিজেই বাগগুলি থাকতে পারে)। তবে x86-তে এটি GCC3.2 এর মতো C99 স্ট্যান্ডার্ডের কাছাকাছি হওয়ার আশা করা যায়।
osgx

4
@ জোশুয়া: সিএআর-তে CHAR_BIT- কে 8 এর বেশি হওয়ার অনুমতি দেওয়া হয়েছে, তবে আকার (চর) এখনও 1 হতে হবে (এবং আমি যখন এই মন্তব্যটি রেখেছিলাম তখন এই উত্তরটি অনেক আলাদা ছিল)। আমি জিসিসি 3-কে মেনে চলছি না, এবং সিটি 89 এখানে একই প্রয়োজনীয়তা তৈরি করে, বিটিডাব্লু। আমি সেই পাঠ্যটি উদ্ধৃত করে বলেছিলাম যে সিএস 99 সংকলনের বিষয়ে ওএসজিএক্সই চিন্তিত এবং C99 সংকলক ব্যবহার করে, তাই কেন তিনি নন-সি 99 সংকলক সম্পর্কে উদ্বিগ্ন?

4
পিডিপি -10 জিসিসির লেখক এখানে। CHAR_BIT 9 বছর, তবে আকার (চার্ট) এখনও 1।
লার্স ব্রিংকফ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.