সি ++ স্ট্যান্ডার্ডটি দীর্ঘ, প্রকারের আকারের আকারটি কী বলে?


696

আমি বেসিক সি ++ প্রকারের আকার সম্পর্কিত বিশদ তথ্য খুঁজছি। আমি জানি যে এটি আর্কিটেকচারের উপর নির্ভর করে (16 বিট, 32 বিট, 64 বিট) এবং সংকলক।

তবে সি ++ এর জন্য কি কোনও মানদণ্ড রয়েছে?

আমি 32-বিট আর্কিটেকচারে ভিজ্যুয়াল স্টুডিও 2008 ব্যবহার করছি। আমি যা পাই তা এখানে:

char  : 1 byte
short : 2 bytes
int   : 4 bytes
long  : 4 bytes
float : 4 bytes
double: 8 bytes

আমি খুঁজে চেষ্টা করেছি, অনেক সাফল্য ছাড়া, নির্ভরযোগ্য এর মাপ জানায় তথ্য char, short, int, long, double, floatবিভিন্ন আর্কিটেকচার ও কম্পাইলার অধীনে (এবং অন্যান্য ধরনের আমি মনে করি না)।


18
@ এটিকে পছন্দ অনুযায়ী নয়, চালিত করুন ... এমন অনেকগুলি আর্কিটেকচার সমর্থন করার জন্য এটি নমনীয় হওয়া দরকার।
ক্রাক্কোস


4
কেন তারা সমস্ত অস্পষ্ট প্রকারগুলি অপসারণ করে না এবং এগুলিকে নির্দিষ্ট বিট দৈর্ঘ্যের ধরণের যেমন int32_t, uint32_t, int64_t ইত্যাদি হিসাবে মানক করে তোলে
developerbmw

5
@ থ্যাটারল এ জাতীয় কিছু মানক করা আসলে বেশ কঠিন। জাভা থেকে আলাদা নয়, যেখানে এই জিনিসগুলি জেভিএমের কাজ করার কারণে স্থির থাকে, সি / সি ++ মূলত সিস্টেমে আটকে থাকতে হয় যেগুলি কোনও অভিনব-প্যানসি বিমূর্ত স্তর ছাড়াই চালিত হয় (কমপক্ষে জাভা সহ অনেকগুলি নয়)- মধ্যে। Int- এ মাপ যে গুরুত্বপূর্ণ একটি ব্যবহার করতে পারেন হয়, তাহলে int16_t, int32_tএবং int64_t(প্রয়োজন iostreamহলে আমি সঠিকভাবে মনে রাখবেন যে জন্য অন্তর্ভুক্ত করুন)। এ সম্পর্কে কী সুন্দর যে int64_t এর 32 বিট সিস্টেমে সমস্যা থাকা উচিত নয় (এটি যদিও কার্য সম্পাদনকে প্রভাবিত করবে)।
rbaleksandar

5
@ আরবালেকসন্দর তারা আসলে সংজ্ঞায়িত হয়েছে <cstdint>, নয় <iostream>
জাস্টিন সময় - মনিকা

উত্তর:


684

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

এর জন্য একটি অতিরিক্ত বাধা charহ'ল এর আকার সর্বদা 1 বাইট বা CHAR_BITবিট (তাই নাম)। এটি স্ট্যান্ডার্ড স্পষ্টভাবে বলা হয়।

সি স্ট্যান্ডার্ডটি সি ++ স্ট্যান্ডার্ডের জন্য একটি আদর্শ রেফারেন্স , সুতরাং এটি এই প্রয়োজনীয়তাগুলি স্পষ্টভাবে বিবরণ দেয় না, সি ++ সি স্ট্যান্ডার্ড (পৃষ্ঠা 22) দ্বারা প্রয়োজনীয় ন্যূনতম ব্যাপ্তিগুলির প্রয়োজন , যা ডেটা টাইপ রেঞ্জের সমান এমএসডিএন :

  1. signed char: -127 থেকে 127 (নোট, -128 থেকে 127 নয়; এটি 1 এর পরিপূরক এবং সাইন-এবং-আকারের প্ল্যাটফর্মগুলিকে সমন্বিত করে)
  2. unsigned char: 0 থেকে 255 পর্যন্ত
  3. "প্লেইন" char: একই ব্যাপ্তি হিসাবে signed charবা unsigned char, বাস্তবায়ন-সংজ্ঞায়িত
  4. signed short: -32767 থেকে 32767
  5. unsigned short: 0 থেকে 65535
  6. signed int: -32767 থেকে 32767
  7. unsigned int: 0 থেকে 65535
  8. signed long: -2147483647 থেকে 2147483647
  9. unsigned long: 0 থেকে 4294967295 এ
  10. signed long long: -9223372036854775807 থেকে 9223372036854775807
  11. unsigned long long: 0 থেকে 18446744073709551615

একটি সি ++ (বা সি) বাস্তবায়ন কোনও ধরণের বাইটের আকারের আকার নির্ধারণ করতে পারে sizeof(type), যতক্ষণ না

  1. অভিব্যক্তি sizeof(type) * CHAR_BITপ্রয়োজনীয় ব্যাপ্তিগুলি ধারণ করতে পর্যাপ্ত পরিমাণে বিটকে মূল্যায়ন করে এবং
  2. প্রকারের ক্রমটি এখনও কার্যকর (যেমন sizeof(int) <= sizeof(long))।

এগুলি একসাথে রেখে, আমরা গ্যারান্টিযুক্ত যে:

  • char, signed charএবং unsigned charকমপক্ষে 8 বিট হয়
  • signed short, unsigned short, signed int, এবং unsigned intঅন্তত 16 বিট
  • signed longএবং unsigned longকমপক্ষে 32 বিট হয়
  • signed long longএবং unsigned long longকমপক্ষে b৪ বিট

এর আকার floatবা তার doubleব্যতীত কোনও গ্যারান্টি দেওয়া হয় না যা doubleকমপক্ষে যতটা নির্ভুলতা সরবরাহ করে float

প্রকৃত বাস্তবায়ন-নির্দিষ্ট রেঞ্জ পাওয়া যেতে পারে, <limits.h>সি হেডার, অথবা <climits>C ++ (অথবা আরও ভাল, টেমপ্লেট করা std::numeric_limitsমধ্যে <limits>হেডার)।

উদাহরণস্বরূপ, আপনি এর জন্য সর্বাধিক সীমাটি পাবেন int:

সি:

#include <limits.h>
const int min_int = INT_MIN;
const int max_int = INT_MAX;

সি ++ :

#include <limits>
const int min_int = std::numeric_limits<int>::min();
const int max_int = std::numeric_limits<int>::max();

49
বরং, সি ++ স্ট্যান্ডার্ডটি বাইট শব্দটি "1 char" অর্থ ব্যবহার করে , এবং সাধারণ অর্থ নয়।
বেন ভয়েগট

4
@ প্রোগ্রামার উত্তরটি পড়ুন (প্যারেন্টেসিসে পয়েন্ট 1 নোট), বা আসল স্ট্যান্ডার্ডের কথাটি (উত্তরে লিঙ্কিত)। সি স্ট্যান্ডার্ড 1 এর পরিপূরক আর্কিটেকচারের সাথে সামঞ্জস্য করে, যার বিস্তৃত 2 এর পরিপূরক থেকে আলাদা প্রতিনিধিত্ব রয়েছে। ন্যূনতম গ্যারান্টিযুক্ত রেঞ্জগুলি বাস্তবায়ন সরবরাহের প্রকৃত ব্যাপ্তির চেয়ে প্রায় সর্বদা পৃথক হবে।
অ্যালেক্স বি

9
@ অ্যালেক্স বি আপনি নিজের উত্তরে দ্বিগুণ সম্পর্কে কিছু উল্লেখ করেন নি। আপনি দয়া করে ভাসমান পয়েন্ট ভেরিয়েবলগুলির জন্য আপনার উত্তরটি আপডেট করতে পারেন?
কুল_কোডার

3
@ কুল_কোডার: ভাসমান পয়েন্টটি মাছের সম্পূর্ণ অতিরিক্ত কেটলি যা সহজেই পোস্টের আকার দ্বিগুণ করে।
Deduplicator

3
@ মুভিং হাঁস: "সি ++ এর সমস্ত সংস্করণে 256 স্বতন্ত্র মান প্রয়োজন [স্বাক্ষর করা চর প্রকারের জন্য]" না, এটি সাম্প্রতিক সি ++ স্পেসে স্থির না হওয়া পর্যন্ত এটি সত্য ছিল না। পুরানো চশমা স্বাক্ষরিত চর ধরণের বিট প্যাটার্নগুলিকে অনুমতি দেয় যা কোনও সংখ্যায় মানচিত্র করে না, তাই তারা 256 স্বতন্ত্র মানগুলির প্রয়োজনীয়তা অনুপস্থিত। "স্বাক্ষরবিহীন চরিত্রের ধরণের জন্য, মান উপস্থাপনের সমস্ত সম্ভাব্য বিট নিদর্শন সংখ্যা উপস্থাপন করে These এই প্রয়োজনীয়তাগুলি অন্য ধরণের জন্য ধারণ করে না।"
অ্যাড্রিয়ান ম্যাকার্থি

241

32-বিট সিস্টেমের জন্য, 'ডি ফ্যাক্টো' স্ট্যান্ডার্ডটি আইএলপি 32 - অর্থাৎ int, longএবং পয়েন্টার সমস্ত 32-বিট পরিমাণে।

-৪-বিট সিস্টেমের জন্য, প্রাথমিক ইউনিক্স 'ডি ফ্যাক্টো' স্ট্যান্ডার্ডটি এলপি long64 - এবং পয়েন্টারটি 64-বিট (তবে int32-বিট হয়)। উইন্ডোজ -৪-বিট স্ট্যান্ডার্ডটি এলএলপি 64৪ - long longএবং পয়েন্টারটি -৪ -বিট (তবে longএবং intউভয়ই 32-বিট)।

একসময় কিছু ইউনিক্স সিস্টেম একটি আইএলপি 64৪ সংগঠন ব্যবহার করেছিল।

এই ডি-ফ্যাক্টো স্ট্যান্ডার্ডগুলির কোনওটিই সি স্ট্যান্ডার্ড (আইএসও / আইসিসি 9899: 1999) দ্বারা আইনী নয়, তবে এর দ্বারা সমস্ত অনুমোদিত হয় are

এবং, সংজ্ঞা দ্বারা, sizeof(char)হয় 1পার্ল কনফিগার স্ক্রিপ্ট পরীক্ষা পরন্তু।

মনে রাখবেন যে CHAR_BIT8 টির চেয়ে অনেক বড় মেশিনগুলি ছিল (ক্রেস) That তার অর্থ, আইআইআরসি sizeof(int)এটিও 1, কারণ উভয়ই ছিল charএবং int32-বিট ছিল।


73
বিষয়গুলি কীভাবে তাত্ত্বিকভাবে হয় তার চেয়ে বরং সবচেয়ে বেশি গুরুত্বপূর্ণ যে বিষয়গুলিতে জিনিসগুলি কীভাবে তা উল্লেখ করার জন্য +1। আপনি যদি 32 বিট ব্যবহার করতে চান, যদি আপনি চান 64 বিট দীর্ঘ দীর্ঘ ব্যবহার করুন। আপনি যদি নেটিভ ব্যবহার করতে চান সাইজ_টি। "প্লেইন" দীর্ঘ এড়িয়ে চলুন কারণ এটি পরিবর্তিত হয়। এটি বেশিরভাগ অ্যাপ্লিকেশনগুলির জন্য কাজ করা উচিত।
এলফ

37
উত্তরের জন্য +1। @ এলফ: বিপরীতে ... আপনি যদি 32 বিট ব্যবহার [u]int32_tবা অনুরূপ চান, আপনি যদি 64 বিট ব্যবহার করতে চান [u]int64_t... আপনার যদি তাদের কোনও শিরোনাম না থাকে, তবে ডাউনলোড করুন বা তৈরি করুন, পছন্দসইভাবে উভয় ক্ষেত্রেই নির্বাচনকাল নির্বাচন করুন আকার যাচাই করতে এই জাতীয় ধরণের বা স্থিতিশীল জোর দেওয়া। pubs.opengroup.org/onlinepubs/009695299/basedefs/stdint.h.html যদি সুনির্দিষ্ট আকারগুলি এত গুরুত্বপূর্ণ না হয় এবং আপনি কেবল সেগুলি কমপক্ষে এটির মতো বড় যত্ন করেন তবে আপনার পরামর্শটি সাধারণ আধুনিক পিসি / সার্ভার প্ল্যাটফর্মের জন্য ধারণ করে।
টনি ডেলরয়

8
লক্ষ্য করুন এটা শুধু পুরাতন ক্রে মেশিন আছে CHAR_BIT> 8. যেমন DSPs প্রায়ই 16 অথবা 32 এর CHAR_BIT (দেখুন উদাঃ আছে নয় এই )
টি

2
@ নোস: লিঙ্কটির জন্য আপনাকে ধন্যবাদ। অডবোল মামলার জন্য আধুনিক, বর্তমান সিস্টেম সনাক্ত করা খুব সহায়ক। কৌতূহলের বাইরে, সেই মেশিনগুলিতে কোড সেট কী? যদি কোড সেটটি ইউটিএফ -16 হয়, তবে 0xFFFF কোনও বৈধ অক্ষর নয় এবং যদি কোড সেটটি কোনও আইএসও 8859-x কোড সেট হয়, তবে আবার 0xFFFF বৈধ অক্ষর নয় (0x00 থেকে 0xFF পর্যন্ত অক্ষর কোডগুলি বৈধ)। আমি এখনও নিশ্চিত নই যে ইওএফ সনাক্ত করতে সমস্যা আছে, তবে অবশ্যই সাবধানতার অবকাশ আছে এবং সম্ভবত এমন কোনও ফাংশন লিখে বা ব্যবহারের জন্য int get_char(FILE *fp, char *c)যা ইওএফ বা 0 এবং সেটগুলি দেয় *c
জোনাথন লেফলার

2
@ জোয়েলউ: সি 11 এর জন্য প্ল্যাটফর্মে যেখানে "ইন্ট" 32 বিট বা তার চেয়ে কম, এবং -1 প্ল্যাটফর্মে যেখানে "ইন্ট" 33 বিট বা তার বেশি হবে uint32_t x=1,y=2;তার মান x-yঅবশ্যই 4294967295 হওয়া উচিত। আরও, এটির জন্য প্রয়োজন যে x*yx এবং y এর সমস্ত মানের জন্য "ইনট" 32 বিট বা তার চেয়ে কম, এবং প্রচলিত পাটিগণিত যদি 65 বিট বা তার চেয়ে বড় হয় তবে বড় মানগুলির সাথে কী ঘটতে পারে তার কোনও প্রয়োজনীয়তা রাখে না x এবং y এর "int" 33 থেকে 64 বিট হলে।
সুপারক্যাট

88

অনুশীলনে এমন কিছুই নেই। প্রায়শই আপনি std::size_tবর্তমান স্থাপত্যে স্বাক্ষরবিহীন দেশীয় পূর্ণসংখ্যার আকারের প্রত্যাশা করতে পারেন । অর্থাত্ ১ 16-বিট, ৩২-বিট বা 64৪-বিট তবে এই উত্তরের মন্তব্যে যেমন নির্দেশিত হয় তেমন ক্ষেত্রে হয় না।

অন্যান্য সমস্ত অন্তর্নির্মিত প্রকারের হিসাবে এটি সত্যিই সংকলকটির উপর নির্ভর করে। সর্বশেষ সি ++ স্ট্যান্ডার্ডের বর্তমান কার্য খসড়া থেকে নেওয়া দুটি অংশ এখানে দেওয়া হয়েছে:

পাঁচটি স্ট্যান্ডার্ড স্বাক্ষরিত পূর্ণসংখ্যার প্রকার রয়েছে: স্বাক্ষর করা চর, শর্ট ইন্টার, ইনট, লং ইনট এবং দীর্ঘ দীর্ঘ অন্তর্নিহিত। এই তালিকায়, প্রতিটি ধরণের তালিকাটিতে পূর্ববর্তীগুলির মতো কমপক্ষে স্টোরেজ সরবরাহ করে।

প্রতিটি স্ট্যান্ডার্ড স্বাক্ষরিত পূর্ণসংখ্যার ধরণের জন্য, এখানে একটি স্বতন্ত্র (তবে পৃথক) স্ট্যান্ডার্ড স্বাক্ষরবিহীন পূর্ণসংখ্যার টাইপ রয়েছে: স্বাক্ষরবিহীন চর, স্বাক্ষরবিহীন শর্ট ইনট, স্বাক্ষরবিহীন ইনট, স্বাক্ষরবিহীন লং ইন্ট এবং স্বাক্ষরযুক্ত লং লং ইন্ট, যার প্রত্যেকটিতে একই পরিমাণ থাকে স্টোরেজ এবং একই প্রান্তিককরণ প্রয়োজনীয়তা আছে।

আপনি যদি চান তবে এই মৌলিক ধরণের আকারগুলি স্থিতিশীলভাবে (সংকলন-সময়) যুক্ত করতে পারেন। যদি আকারের অনুমানগুলি পরিবর্তন হয় তবে এটি আপনার কোডটি পোর্টিং সম্পর্কে চিন্তা করতে লোককে সতর্ক করবে।


7
ভাল পোস্ট। আর একটি জিনিস যা প্রয়োজন তা হ'ল নিম্নতম বিট-মাপসই (c89 / c99 এ নথিগুলি একসাথে সীমাবদ্ধতা সহ এবং c ++ দ্বারা গ্রহণ করা হয়েছে): চর> = 8, সংক্ষিপ্ত এবং অন্তঃসত্ত্বা = 16, দীর্ঘ> = 32।
জোহানেস স্কাউব -

1
এছাড়াও, একটি 8 বিট এভিআর প্ল্যাটফর্মের আকার_টি 8 বিট হবে না, তবে 16 হবে, কারণ পয়েন্টার এবং ইনট আকার 16 বিট its সুতরাং প্রসেসরের নেটিভ ডেটা আকার আকার_t এর সাথে সম্পর্কিত নয়।
রোবটব্যাগস 10:38

80

মান আছে।

সি 90 স্ট্যান্ডার্ডের এটি প্রয়োজন

sizeof(short) <= sizeof(int) <= sizeof(long)

C99 স্ট্যান্ডার্ডের এটি প্রয়োজন

sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)

এখানে C99 টি নির্দিষ্টকরণ রয়েছে । পৃষ্ঠা 22 বিভিন্ন অবিচ্ছেদ্য ধরণের বিশদ আকার।

উইন্ডোজ প্ল্যাটফর্মগুলির জন্য এখানে ইনট টাইপ আকার (বিট) রয়েছে:

Type           C99 Minimum     Windows 32bit
char           8               8
short          16              16
int            16              32
long           32              32
long long      64              64

আপনি যদি বহনযোগ্যতার সাথে উদ্বিগ্ন হন, বা আপনি এই জাতীয় নামটির আকারটি প্রতিবিম্বিত করতে চান তবে আপনি শিরোনামটি দেখতে পারেন <inttypes.h>, যেখানে নিম্নলিখিত ম্যাক্রোগুলি উপলব্ধ:

int8_t
int16_t
int32_t
int64_t

int8_tএটি 8 বিট int16_tহওয়ার গ্যারান্টিযুক্ত এবং 16 বিট ইত্যাদির গ্যারান্টিযুক্ত


8
গৌণ নিতপিক: প্রতিসমের sizeof(long) < sizeof(long long)বিপরীতে মানটি কোথায় বলে sizeof(long) <= sizeof(long long)?
জোনাথন লেফলার

2
@ জোনাথনলফলার - C99 5.2.4.2.1 দেখুন - পূর্ণসংখ্যার ধরণের আকার। minsizeof (int) == 16-বিটস, minsizeof (দীর্ঘ) == 32-বিট, minsizeof (দীর্ঘ দীর্ঘ) == 64-বিট। সুতরাং আমি মনে করি আপনি ঠিক ঠিক <= ঠিক তেমন কোনও ম্যাক্সিজোফ (টাইপ) নির্দিষ্ট করে নেই।
জেসি চিশলম

একইভাবে আকারের (ভাসমান) <= আকারের (ডাবল) <= আকারের (দীর্ঘ ডাবল)। C99 7.12 অনুচ্ছেদ অনুযায়ী 2
জেসি চিশলম

38

আপনি আকার ধরনের সংশোধন করা হয়েছে প্রয়োজন হলে, uint32_t মত ধরনের ব্যবহার (স্বাক্ষরবিহীন পূর্ণসংখ্যা 32 বিট) সংজ্ঞায়িত stdint.h । সেগুলি C99 এ নির্দিষ্ট করা আছে ।


10
সেগুলি নির্দিষ্ট করা হলেও প্রয়োজনীয় নয়।
ড্রিমলাক্স

2
@ ড্রিমলাক্স কোন প্ল্যাটফর্মগুলিতে এটি অন্তর্ভুক্ত নেই?
লেভি মরিসন

3
@ লেভিমারিসন: যে কোনও প্ল্যাটফর্মের প্রয়োজনীয় ফর্মটিতে সেগুলি নেই। CHAR_BIT == 16উদাহরণস্বরূপ, এমন একটি প্ল্যাটফর্ম থাকবে না int8_t। যে কোনও প্ল্যাটফর্ম ব্যবহার করছে না দুই এর সম্পূরক থাকবে না কোনো তাদের (যেমন দুই এর সম্পূরক মান দ্বারা প্রয়োজন বোধ করা হয়)।
দেবসোলার

36

আপডেট হয়েছে: সি ++ 11 টিআর 1 থেকে প্রকারটি আনুষ্ঠানিকভাবে স্ট্যান্ডার্ড এ নিয়েছে:

  • দীর্ঘ দীর্ঘ int
  • স্বাক্ষরবিহীন দীর্ঘ দীর্ঘ int

এবং "আকারের" প্রকারগুলি থেকে <cstdint>

  • int8_t
  • int16_t
  • int32_t
  • int64_t
  • (এবং স্বাক্ষরযুক্ত স্বাক্ষরকারীদের)।

এছাড়াও আপনি পাবেন:

  • int_least8_t
  • int_least16_t
  • int_least32_t
  • int_least64_t
  • স্বাক্ষরযুক্ত স্বাক্ষরকারীদেরও প্লাস করুন।

এই ধরণেরগুলি বিটগুলির কমপক্ষে নির্দিষ্ট সংখ্যার সাথে ক্ষুদ্রতম পূর্ণসংখ্যার প্রকারগুলি উপস্থাপন করে। তেমনি কমপক্ষে নির্দিষ্ট সংখ্যক বিটের সংখ্যার সাথে "দ্রুততম" পূর্ণসংখ্যার প্রকারগুলি রয়েছে:

  • int_fast8_t
  • int_fast16_t
  • int_fast32_t
  • int_fast64_t
  • এছাড়াও স্বাক্ষরবিহীন সংস্করণগুলি।

"দ্রুত" অর্থ কী, যদি কিছু হয় তবে তা বাস্তবায়নের উপর নির্ভর করে। এটি কোনও উদ্দেশ্যেই দ্রুত হওয়া দরকার না।


এটি এখন সি ++ 11 স্ট্যান্ডার্ডের একটি অংশ।
জান

2
"দ্রুত" এর অর্থ হ'ল হার্ডওয়্যার আর্কিটেকচার অনুসারে। যদি নিবন্ধগুলি 16-বিট হয়, তবে int_fast8_t একটি 16-বিট মান। যদি নিবন্ধগুলি 32-বিট হয়, তবে int_fast8_t এবং int_fast16_t উভয়ই 32-বিট মান। ইত্যাদি। C99 বিভাগ 7.18.1.3 অনুচ্ছেদ 2 দেখুন
জেসি

19

সি ++ স্ট্যান্ডার্ড এটা ভালো বলেছেন:

৩.৯.১০, §২:

পাঁচটি স্বাক্ষরিত পূর্ণসংখ্যার প্রকার রয়েছে: "স্বাক্ষরিত চর", "শর্ট ইনট", "ইনট", "লং ইনট" এবং "লং লং ইনট"। এই তালিকায়, প্রতিটি ধরণের তালিকাটিতে পূর্ববর্তীগুলির মতো কমপক্ষে স্টোরেজ সরবরাহ করে। সরল ints প্রাকৃতিক নির্বাহ পরিবেশের (44) আর্কিটেকচার দ্বারা প্রস্তাবিত আকার আছে; অন্যান্য স্বাক্ষরিত পূর্ণসংখ্যার প্রকারগুলি বিশেষ চাহিদা পূরণের জন্য সরবরাহ করা হয়।

(44) এটি শিরোনামে সংজ্ঞায়িত হিসাবে INT_MIN এবং INT_MAX এর পরিসরের কোনও মান ধারণ করার জন্য যথেষ্ট বড় <climits>

উপসংহার: আপনি কোন আর্কিটেকচারের উপর কাজ করছেন তা নির্ভর করে। অন্য কোন অনুমান মিথ্যা।


12

নাহ, ধরণের আকারের জন্য কোনও মান নেই। স্ট্যান্ডার্ডটির কেবল এটির প্রয়োজন:

sizeof(short int) <= sizeof(int) <= sizeof(long int)

আপনি যদি স্থির আকারের ভেরিয়েবলগুলি চান তবে সর্বোত্তম কাজটি হ'ল ম্যাক্রোগুলি ব্যবহার করা:

#ifdef SYSTEM_X
  #define WORD int
#else
  #define WORD long int
#endif

তারপরে আপনি আপনার ভেরিয়েবলগুলি সংজ্ঞায়িত করতে WORD ব্যবহার করতে পারেন। এটি এমন নয় যে আমি এটি পছন্দ করি তবে এটি সর্বাধিক বহনযোগ্য উপায়।


4
সমস্যাটি হ'ল ডাব্লুআরড প্রোগ্রামের চারপাশে এমন অঞ্চলে ছড়িয়ে পড়ে যা কোনও স্থির আকারের উপর নির্ভর করে না (কিছু উইন্ডোজ কোড দেখুন)। আমি যেমন 16 বিট থেকে 32 বিট সিস্টেমে চলে যাওয়ার সময় জানতে পেরেছিলাম যে আপনি একই সমস্যাটি শেষ করেছিলেন যা ডাব্লুআরড সমাধান করার জন্য হয়েছিল।
লিলবার্ন

@ লিবুর্ন অবশ্যই আপনার যখন ডাব্লু ডাব্লু ব্যবহার করা উচিত তখনই যখন আপনার নির্দিষ্ট আকারের পরিবর্তনশীল দরকার হয়, যেমন আপনি যখন / ফাইল থেকে / পড়তে লিখছেন। কোডের কোনও অংশ যদি কোনও স্থির আকার থেকে সত্যই নির্ভরশীল না হয়, তবে আপনার স্বাভাবিক "ইনট" ভেরিয়েবলগুলি ব্যবহার করা উচিত।
এমিলিয়ানো

3
ভাল জিনিস আপনি পেতে পোর্টেবল মাপ হওয়া উচিত কি করতে পারেন#include <boost/cstdint.hpp>
kizzx2

11

আমাদের প্রকারের প্রতিশব্দ সংজ্ঞায়িত করার অনুমতি দেওয়া হয় যাতে আমরা আমাদের নিজস্ব "স্ট্যান্ডার্ড" তৈরি করতে পারি।

কোন মেশিনে যার আকারের (int) == 4, আমরা সংজ্ঞা দিতে পারি:

typedef int int32;

int32 i;
int32 j;
...

সুতরাং যখন আমরা কোডটি অন্য কোনও মেশিনে স্থানান্তর করি যেখানে লং ইন্টের প্রকৃত আকার 4 হয়, আমরা কেবল ইনট এর একক সংঘটনটিকে নতুন করে সংজ্ঞায়িত করতে পারি।

typedef long int int32;

int32 i;
int32 j;
...

1
এটি স্ট্যান্ডার্ড শিরোনাম <stdint.h>(সি 99 এবং তার পরে এবং যেটি সি ++ স্ট্যান্ডার্ড সি লাইব্রেরির C99 সংস্করণ গ্রহণ করেছে) প্রদত্ত প্রয়োজনীয় নয় ।
কিথ থম্পসন

8

ফ্লোটিং পয়েন্ট সংখ্যার জন্য একটি স্ট্যান্ডার্ড রয়েছে (আইইইই )75৫৪) : ফ্লোটগুলি 32 বিট এবং ডাবলস 64 হয় This এটি একটি হার্ডওয়্যার স্ট্যান্ডার্ড, সি ++ স্ট্যান্ডার্ড নয়, তাই সংকলকরা তাত্ত্বিকভাবে ফ্লোট এবং অন্য কোনও আকারের দ্বিগুণ সংজ্ঞা দিতে পারতেন, তবে অনুশীলনে আমি ' কখনও কোনও স্থাপত্য দেখেনি যা ভিন্ন কিছু ব্যবহার করে।


2
যাইহোক, আইইইই 754 (ওরফে আইইসি 559) এর সাথে সম্মতি সি ++ এর মধ্যে probablyচ্ছিক (সম্ভবত সিও, তবে আমি নিশ্চিত নই)। Std :: সংখ্যািক_লিট :: is_iec559 দেখুন।
ড্রয় হল

1
তারপরে আপনি টিএমএস 320 সি 28 টি ডিএসপি-র জন্য টিআই-এর সংকলকটি দেখতে পান নি, যেখানে doubleএকই আকার রয়েছে float(এবং intএকই হিসাবে char, উভয়ই 16 বিট)। তবে তাদের একটি 64 বিট আছে long double
তারকাচিহ্ন

7

একটি মান রয়েছে এবং এটি বিভিন্ন মানের নথিতে (আইএসও, এএনএসআই এবং হোয়াট নোট) নির্দিষ্ট করা আছে।

উইকিপিডিয়ায় একটি দুর্দান্ত পৃষ্ঠা রয়েছে যা বিভিন্ন ধরণের এবং তারা যে সর্বাধিক সঞ্চয় করতে পারে সেগুলি ব্যাখ্যা করে: কম্পিউটার বিজ্ঞানে পূর্ণসংখ্যা।

তবে একটি সাধারণ সি ++ সংকলক সহ আপনি নিম্নলিখিত কোড স্নিপেট ব্যবহার তুলনামূলকভাবে সহজেই জানতে পারবেন:

#include <iostream>
#include <limits>


int main() {
    // Change the template parameter to the various different types.
    std::cout << std::numeric_limits<int>::max() << std::endl;
}

র‌্যাডওয়েভে ন্যূনতম_লিমিটের নথিপত্র পাওয়া যাবে । এতে অন্যান্য সীমাবদ্ধতার আধিক্য রয়েছে যা আপনি বিভিন্ন সীমা জানতে ফোন করতে পারেন। এটি আকার নির্ধারণ করে এমন যেকোন স্বেচ্ছাসেবী প্রকারের সাথে ব্যবহার করা যেতে পারে, উদাহরণস্বরূপ std :: streamsize।

জন এর উত্তরে সর্বোত্তম বিবরণ রয়েছে, কারণ এগুলি ধারণের গ্যারান্টিযুক্ত। : কোন ব্যাপার কি প্ল্যাটফর্ম আপনি হয়, আরেকটা ভাল যে পৃষ্ঠাটি কতগুলি বিট প্রতিটি টাইপ থাকা আবশ্যক হিসেবে আরো বিস্তারিত মধ্যে যায় int- এ ধরনের , যা মান মধ্যে সংজ্ঞায়িত করা হয়।

আশা করি এটা কাজে লাগবে!



7

তুমি ব্যবহার করতে পার:

cout << "size of datatype = " << sizeof(datatype) << endl;

datatype = int, long intইত্যাদি আপনি যে কোনও ডেটাটাইপ টাইপ করুন তার আকার দেখতে সক্ষম হবেন।


7

যখন এটি বিভিন্ন আর্কিটেকচার এবং বিভিন্ন সংকলকগুলির জন্য প্রকারভেদে তৈরি হয় তখন কী আউটপুট হয় তা দেখতে কেবল আপনার সংকলকটি দিয়ে আপনার আর্কিটেকচারে নিম্নলিখিত কোডটি চালান। নীচে আমার উবুন্টু 13.04 (রিং রিংটেল) 64 বিট জি ++ 4.7.3 আউটপুট দেখায়। এছাড়াও দয়া করে নোট করুন নীচে কী জবাব দেওয়া হয়েছিল যে কারণে আউটপুটটি কেন এইভাবে অর্ডার করা হয়েছে:

"পাঁচটি স্ট্যান্ডার্ড স্বাক্ষরিত পূর্ণসংখ্যার প্রকার রয়েছে: স্বাক্ষর করা চর, শর্ট ইনট, ইনট, লং ইনট এবং লং লং ইনট। এই তালিকায় প্রতিটি টাইপ কমপক্ষে যতটা স্টোরেজ সরবরাহ করে তার তালিকায় এর আগে রয়েছে"।

#include <iostream>

int main ( int argc, char * argv[] )
{
  std::cout<< "size of char: " << sizeof (char) << std::endl;
  std::cout<< "size of short: " << sizeof (short) << std::endl;
  std::cout<< "size of int: " << sizeof (int) << std::endl;
  std::cout<< "size of long: " << sizeof (long) << std::endl;
  std::cout<< "size of long long: " << sizeof (long long) << std::endl;

  std::cout<< "size of float: " << sizeof (float) << std::endl;
  std::cout<< "size of double: " << sizeof (double) << std::endl;

  std::cout<< "size of pointer: " << sizeof (int *) << std::endl;
}


size of char: 1
size of short: 2
size of int: 4
size of long: 8
size of long long: 8
size of float: 4
size of double: 8
size of pointer: 8

sizeof(char)অন্তর্ভুক্ত করা উচিত নয়।
ভেন

3

উল্লিখিত আকার হিসাবে বর্তমান আর্কিটেকচার প্রতিফলিত করা উচিত। limits.hআপনার বর্তমান সংকলক কীভাবে জিনিসগুলি পরিচালনা করছে তা আপনি দেখতে চাইলে আপনি প্রায় শীর্ষে উঠতে পারেন ।


ধন্যবাদ, তবে আমি আমার কাছে নিজের মতামত নেই এমন এ্যাচটিচারের আকারগুলি জানতে চাই (bits৪ বাইটের মতো)। 32bits achitectures সম্পর্কে এই টিউটোরিয়ালটি শুধুমাত্র আলাপ ...
জেরোম

2

অন্যরা যেমন উত্তর দিয়েছে, "মানদণ্ডগুলি" সমস্ত ক্ষেত্রে বিশদটি "বাস্তবায়ন সংজ্ঞায়িত" হিসাবে ছেড়ে দেয় এবং কেবল "চর" টাইপ করে লিখিত থাকে যে "চর_বিস" প্রশস্ত, এবং সেই "চর <= সংক্ষিপ্ত <= অন্ত << দীর্ঘ < = দীর্ঘ দীর্ঘ "(আইআইইই ভাসমান পয়েন্ট স্ট্যান্ডার্ডগুলির সাথে ভাসমান এবং ডাবল বেশ সুসংগত এবং লম্বা ডাবল সাধারণত ডাবলের সমান - তবে আরও বর্তমান বাস্তবায়নে বড় হতে পারে)।

খুব নির্দিষ্ট এবং সঠিক মান না রাখার কারণগুলির একটি কারণ হ'ল সি / সি ++ এর মতো ভাষাগুলি প্রচুর পরিমাণে হার্ডওয়্যার প্ল্যাটফর্মের কাছে বহনযোগ্য হিসাবে ডিজাইন করা হয়েছিল - কম্পিউটার সিস্টেম সহ যেখানে "চর" শব্দটির আকার 4-বিট হতে পারে বা 7-বিটস, বা "8- / 16- / 32- / 64-বিট" কম্পিউটারগুলি ছাড়াও অন্য কোনও মান গড় হোম কম্পিউটারের ব্যবহারকারী দ্বারা প্রকাশ করা হয়। (এখানে শব্দ-আকারের অর্থ হল সিস্টেমটি কত বিট বিস্তৃত সাধারণত চালিত করে - আবার, হোম কম্পিউটার ব্যবহারকারীরা আশা করতে পারে এটি সর্বদা 8-বিট নয়))

আপনার যদি সত্যিকারের নির্দিষ্ট সংখ্যক বিটের কোনও অবজেক্টের (একটি বিভক্তির মানকে বোঝায় এমন বিটগুলির অর্থে) প্রয়োজন হয় তবে বেশিরভাগ সংকলকগুলির নির্দিষ্ট করে দেওয়ার কিছু পদ্ধতি রয়েছে; তবে এটি সাধারণত পোর্টেবল হয় না, এমনকি এএমএই সংস্থার তৈরি বিভিন্ন সংকলকের মধ্যেও বিভিন্ন প্ল্যাটফর্মের জন্য। কিছু স্ট্যান্ডার্ড এবং অনুশীলন (বিশেষত সীমাবদ্ধতা। এবং এর মতো) যথেষ্ট সাধারণ যে বেশিরভাগ সংকলকগুলির নির্দিষ্ট মানের নির্দিষ্ট পরিসরের জন্য সেরা-ফিট টাইপ নির্ধারণের জন্য সমর্থন থাকবে তবে ব্যবহৃত বিটের সংখ্যা নয়। (এটি হ'ল যদি আপনি জানেন যে আপনার 0 এবং 127 এর মধ্যে মানগুলি রাখা দরকার তবে আপনি নির্ধারণ করতে পারেন যে আপনার সংকলকটি "ইনট 8" টাইপ 8-বিটকে সমর্থন করে যা সম্পূর্ণ পরিসীমা পছন্দসই ধারণ করার জন্য বড় আকারের হবে, তবে এর মতো কিছু নয় not "int7" টাইপ যা which-বিটগুলির সাথে একটি সঠিক মিল হতে পারে))

দ্রষ্টব্য: অনেক আন * x উত্স প্যাকেজগুলি "./configure" স্ক্রিপ্ট ব্যবহৃত হয়েছে যা সংকলক / সিস্টেমের ক্ষমতা এবং উপযুক্ত Makefile এবং config.h এর আউটপুট দেয়। তারা কীভাবে কাজ করে এবং কীভাবে তারা কমলার / সিস্টেমের সক্ষমতা অনুসন্ধান করে এবং তাদের নেতৃত্ব অনুসরণ করে তা দেখতে আপনি এই স্ক্রিপ্টগুলির কয়েকটি পরীক্ষা করতে পারেন।


1

আপনি যদি খাঁটি সি ++ সমাধানে আগ্রহী হন তবে আমি টেমপ্লেটগুলি এবং বিট আকারের উপর ভিত্তি করে সংকলনের সময় প্রকারগুলি সংজ্ঞায়িত করতে কেবল সি ++ স্ট্যান্ডার্ড কোড ব্যবহার করি। এটি সংকলক জুড়ে সমাধানকে পোর্টেবল করে তোলে।

পেছনের ধারণাটি খুব সহজ: চর, অন্তর্, সংক্ষিপ্ত, দীর্ঘ, দীর্ঘ দীর্ঘ (স্বাক্ষরিত এবং স্বাক্ষরবিহীন সংস্করণ) প্রকারযুক্ত একটি তালিকা তৈরি করুন এবং তালিকাটি স্ক্যান করুন এবং সংখ্যাযুক্ত_লিমিট টেম্পলেট ব্যবহার করে প্রদত্ত আকারের সাথে প্রকারটি নির্বাচন করুন।

এই শিরোনামটি সহ আপনি 8 প্রকারের stdtype :: int8, stdtype :: int16, stdtype :: int32, stdtype :: int64, stdtype :: uint8, stdtype :: uint16, stdtype :: uint32, stdtype :: uint64 পেয়েছেন।

যদি কোনও ধরণের প্রতিনিধিত্ব করা না যায় তবে এটি stdtype :: null_type এও শিরোনামে ঘোষণা করা হবে।

কোড নীচে ওয়ারেন্টি ছাড়াই দেওয়া হচ্ছে, এটি ডবল চেক করুন।
আমি মেট্রোগ্রোমিংয়ে নতুন এসেছি, এই কোডটি সম্পাদনা এবং সংশোধন করার জন্য নিখরচায় অনুভব করি।
ডিভিসি ++ দিয়ে পরীক্ষিত (সুতরাং একটি জিসিসি সংস্করণ প্রায় 3.5)

#include <limits>

namespace stdtype
{
    using namespace std;


    /*
     * THIS IS THE CLASS USED TO SEMANTICALLY SPECIFY A NULL TYPE.
     * YOU CAN USE WHATEVER YOU WANT AND EVEN DRIVE A COMPILE ERROR IF IT IS 
     * DECLARED/USED.
     *
     * PLEASE NOTE that C++ std define sizeof of an empty class to be 1.
     */
    class null_type{};

    /*
     *  Template for creating lists of types
     *
     *  T is type to hold
     *  S is the next type_list<T,S> type
     *
     *  Example:
     *   Creating a list with type int and char: 
     *      typedef type_list<int, type_list<char> > test;
     *      test::value         //int
     *      test::next::value   //char
     */
    template <typename T, typename S> struct type_list
    {
        typedef T value;
        typedef S next;         

    };




    /*
     * Declaration of template struct for selecting a type from the list
     */
    template <typename list, int b, int ctl> struct select_type;


    /*
     * Find a type with specified "b" bit in list "list"
     *
     * 
     */
    template <typename list, int b> struct find_type
    {   
        private:
            //Handy name for the type at the head of the list
            typedef typename list::value cur_type;

            //Number of bits of the type at the head
            //CHANGE THIS (compile time) exp TO USE ANOTHER TYPE LEN COMPUTING
            enum {cur_type_bits = numeric_limits<cur_type>::digits};

        public:
            //Select the type at the head if b == cur_type_bits else
            //select_type call find_type with list::next
            typedef  typename select_type<list, b, cur_type_bits>::type type;
    };

    /*
     * This is the specialization for empty list, return the null_type
     * OVVERRIDE this struct to ADD CUSTOM BEHAVIOR for the TYPE NOT FOUND case
     * (ie search for type with 17 bits on common archs)
     */
    template <int b> struct find_type<null_type, b>
    {   
        typedef null_type type;

    };


    /*
     * Primary template for selecting the type at the head of the list if
     * it matches the requested bits (b == ctl)
     *
     * If b == ctl the partial specified templated is evaluated so here we have
     * b != ctl. We call find_type on the next element of the list
     */
    template <typename list, int b, int ctl> struct select_type
    {   
            typedef  typename find_type<typename list::next, b>::type type; 
    };

    /*
     * This partial specified templated is used to select top type of a list
     * it is called by find_type with the list of value (consumed at each call)
     * the bits requested (b) and the current type (top type) length in bits
     *
     * We specialice the b == ctl case
     */
    template <typename list, int b> struct select_type<list, b, b>
    {
            typedef typename list::value type;
    };


    /*
     * These are the types list, to avoid possible ambiguity (some weird archs)
     * we kept signed and unsigned separated
     */

    #define UNSIGNED_TYPES type_list<unsigned char,         \
        type_list<unsigned short,                           \
        type_list<unsigned int,                             \
        type_list<unsigned long,                            \
        type_list<unsigned long long, null_type> > > > >

    #define SIGNED_TYPES type_list<signed char,         \
        type_list<signed short,                         \
        type_list<signed int,                           \
        type_list<signed long,                          \
        type_list<signed long long, null_type> > > > >



    /*
     * These are acutally typedef used in programs.
     * 
     * Nomenclature is [u]intN where u if present means unsigned, N is the 
     * number of bits in the integer
     *
     * find_type is used simply by giving first a type_list then the number of 
     * bits to search for.
     *
     * NB. Each type in the type list must had specified the template 
     * numeric_limits as it is used to compute the type len in (binary) digit.
     */
    typedef find_type<UNSIGNED_TYPES, 8>::type  uint8;
    typedef find_type<UNSIGNED_TYPES, 16>::type uint16;
    typedef find_type<UNSIGNED_TYPES, 32>::type uint32;
    typedef find_type<UNSIGNED_TYPES, 64>::type uint64;

    typedef find_type<SIGNED_TYPES, 7>::type    int8;
    typedef find_type<SIGNED_TYPES, 15>::type   int16;
    typedef find_type<SIGNED_TYPES, 31>::type   int32;
    typedef find_type<SIGNED_TYPES, 63>::type   int64;

}

0
unsigned char bits = sizeof(X) << 3;

যেখানে Xএকটি হয় char, int, longইত্যাদি .. আপনি মাপ দেব Xবিট হবে।


1
একটি চর সবসময় 8 বিট হয় না, তাই আপনার এক্সপ্রেশনটি 8-বিট চরের নন এমন আর্কিটেকচারে কাজ করবে না । কেবল sizeof(type)*CHAR_BITহোল্ড করে
ফুকলভ

এমনকি যদি CHAR_BIT8 টি বিট হওয়ার গ্যারান্টি দেওয়া হয় তবে << 3এটি কেবল লেখার জন্য একটি অস্পষ্ট উপায় * 8বা * CHAR_BIT
কিথ থম্পসন

0

অ্যালেক্স বি থেকে সি ++ স্ট্যান্ডার্ড বাইটগুলিতে অবিচ্ছেদ্য ধরণের আকার নির্দিষ্ট করে না তবে এটি ন্যূনতম ব্যাপ্তিগুলি অবশ্যই ধরে রাখতে সক্ষম করে। আপনি প্রয়োজনীয় ব্যাপ্তি থেকে বিটগুলিতে সর্বনিম্ন আকার নির্ধারণ করতে পারেন। আপনি সেই থেকে বাইটের মধ্যে ন্যূনতম আকারটি নির্ধারণ করতে পারেন এবং CHAR_BIT ম্যাক্রোর মান যা বাইটে বিটের সংখ্যা নির্ধারণ করে (এটি সর্বোপরি অস্পষ্ট প্ল্যাটফর্মগুলির 8 টির মধ্যে এবং এটি 8 এরও কম হতে পারে না)।

চরের জন্য একটি অতিরিক্ত বাধা হ'ল এর আকার সর্বদা 1 বাইট, বা CHAR_BIT বিট (তাই নাম) name

মানক দ্বারা প্রয়োজনীয় সর্বনিম্ন ব্যাপ্তি (22 পৃষ্ঠা) হ'ল:

এমএসডিএন-তে ডেটা ধরণের রেঞ্জ:

স্বাক্ষরিত চর: -127 থেকে 127 (নোট, -128 থেকে 127 নয়; এটি 1 এর পরিপূরক প্ল্যাটফর্মগুলিকে সমন্বিত করে) স্বাক্ষরযুক্ত স্বর: 0 থেকে 255 "সরল" চর: -127 থেকে 127 বা 0 থেকে 255 (ডিফল্ট চর স্বাক্ষরের উপর নির্ভর করে) স্বাক্ষরিত সংক্ষিপ্ত: -32767 থেকে 32767 স্বাক্ষরযুক্ত স্বল্প: 0 থেকে 65535 স্বাক্ষরিত int: -32767 থেকে 32767 স্বাক্ষরিত int: 0 থেকে 65535 স্বাক্ষরিত দীর্ঘ: -2147483647 থেকে 2147483647 স্বাক্ষরযুক্ত দীর্ঘ: 0 থেকে 4294967295 স্বাক্ষরিত দীর্ঘ দীর্ঘ: -9223372036854775807 থেকে 922372036854775: 0 থেকে 18446744073709551615 এ সি ++ (বা সি) বাস্তবায়ন কোনও মান হিসাবে বাইট আকারের (টাইপ) কোনও ধরণের আকার নির্ধারণ করতে পারে, যতক্ষণ না

এক্সপ্রেশন আকার (টাইপ) * CHAR_BIT প্রয়োজনীয় ব্যাপ্তিগুলি ধারণ করতে পর্যাপ্ত বিটের সংখ্যাকে মূল্যায়ন করে এবং প্রকারের ক্রমটি এখনও বৈধ (যেমন আকারের (int) <= আকারের (দীর্ঘ))। আসল বাস্তবায়ন-নির্দিষ্ট রেঞ্জগুলি সিতে, বা সি ++ (অথবা আরও ভাল, টেম্প্লেটেড স্টাড :: সংখ্যাসূচক_ শিরোনামে সংখ্যাগুলি) পাওয়া যায়।

উদাহরণস্বরূপ, আপনি এভাবে অন্তর্নির্মিত সর্বাধিক সীমাটি খুঁজে পাবেন:

সি:

#include <limits.h>
const int min_int = INT_MIN;
const int max_int = INT_MAX;

সি ++:

#include <limits>
const int min_int = std::numeric_limits<int>::min();
const int max_int = std::numeric_limits<int>::max();

এটি সঠিক, তবে আপনি এই কথাটিও ঠিক বলেছেন: চর: 1 বাইট শর্ট: 2 বাইট ইনট: 4 বাইট দীর্ঘ: 4 বাইট ভাসা: 4 বাইট ডাবল: 8 বাইট

কারণ 32 বিট আর্কিটেকচারগুলি এখনও ডিফল্ট এবং সর্বাধিক ব্যবহৃত এবং এগুলি 32-পূর্ব বিট দিনগুলি থেকে স্মৃতিশক্তি কম উপলভ্য থাকাকালীন থেকে তারা এই মানক মাপগুলি রেখেছিল, এবং পিছনের সামঞ্জস্য এবং মানকতার জন্য এটি একই ছিল remained এমনকি bit৪ বিট সিস্টেমগুলি এগুলি ব্যবহার করে এবং এক্সটেনশন / পরিবর্তন করে। আরও তথ্যের জন্য দয়া করে এটি উল্লেখ করুন:

http://en.cppreference.com/w/cpp/language/types


0

আমি লক্ষ্য করেছি যে এখানে অন্যান্য সমস্ত উত্তর প্রায় একচেটিয়াভাবে অবিচ্ছেদ্য ধরণের উপর দৃষ্টি নিবদ্ধ করেছে, যখন প্রশ্নকারীও ভাসমান-পয়েন্টগুলি সম্পর্কে জিজ্ঞাসা করেছিলেন।

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

  • অর্ধ নির্ভুলতা (বাইনারি 16) - 11-বিট তাত্পর্যপূর্ণ, খাঁটি পরিসীমা -14 থেকে 15
  • একক নির্ভুলতা (বাইনারি 32) - 24-বিট তাত্পর্যপূর্ণ, ঘনিষ্ঠ পরিসীমা -126 থেকে 127
  • ডাবল স্পষ্টতা (বাইনারি 64) - 53-বিট তাত্পর্যপূর্ণ, খাঁটি পরিসীমা -1022 থেকে 1023
  • চতুর্মুখী নির্ভুলতা (বাইনারি 128) - 113-বিট তাত্পর্যপূর্ণ, খাঁটি পরিসীমা -16382 থেকে 16383

তাহলে এই মানচিত্রটি সি ++ প্রকারের মধ্যে কীভাবে যায়? সাধারণত floatব্যবহার একক নির্ভুলতা; এভাবেsizeof(float) = 4 ,। তারপরে doubleডাবল স্পষ্টতা ব্যবহার করে (আমি বিশ্বাস করি যে এটিই নামের উত্স double) এবং long doubleএটি দ্বিগুণ বা চতুর্থাংশ নির্ভুলতা হতে পারে (এটি আমার সিস্টেমে চারগুণ, তবে 32-বিট সিস্টেমে এটি দ্বিগুণ হতে পারে)। আমি এমন কোনও সংকলক জানি না যা অর্ধ নির্ভুলতা ভাসমান-পয়েন্ট দেয়।

সংক্ষেপে, এটি সাধারণত:

  • sizeof(float) = 4
  • sizeof(double) = 8
  • sizeof(long double) = 8 বা 16

মজার বিষয় যে জেফ তার প্রয়োজনের চেয়ে আরও বেশি বাইট কেন ব্যবহার করে তা ভাবার অংশ হিসাবে আমি এই প্রশ্নে পৌঁছেছি।
অনিরুদ্ধ ভার্মা

-1

যেমন আপনি উল্লেখ করেছেন - এটি মূলত সংকলক এবং প্ল্যাটফর্মের উপর নির্ভর করে। এর জন্য, এএনএসআই স্ট্যান্ডার্ড পরীক্ষা করুন, http://home.att.net/~jackklein/c/inttypes.html

মাইক্রোসফ্ট সংকলকের জন্য এখানে একটি: ডেটা টাইপ রেঞ্জ


-2

আপনি ওপেনগিএল , কিউটি হিসাবে লাইব্রেরি দ্বারা সরবরাহিত ভেরিয়েবলগুলি ব্যবহার করতে পারেন ইত্যাদি

উদাহরণস্বরূপ, কিউটি উপলব্ধ qint8, qint16, qint32, qint64, quint8, quint16, quint32, quint64, ইত্যাদি (হতে নিশ্চিত Qt দ্বারা সমর্থিত সকল প্ল্যাটফর্মের উপর 8-বিট)


1
প্রশ্নের উত্তর দেয় না
এভিল টিচ

-8

একটি 64-বিট মেশিনে:

int: 4
long: 8
long long: 8
void*: 8
size_t: 8

2
কিছু 64 বিট মেশিনে int8 বাইট হয়, তবে অন্যটি গ্যারান্টিযুক্ত নয়। এমন কিছু নেই যা বলে যে charএটি কেবল 8 বিট হওয়া উচিত। এটি sizeof(void*)==464 বিট থাকা সত্ত্বেও এটি অনুমোদিত ।
আকাশ ছোঁয়া

-10

আকারের উপর ভিত্তি করে চার ধরণের পূর্ণসংখ্যা রয়েছে:

  • সংক্ষিপ্ত পূর্ণসংখ্যা: 2 বাইট
  • দীর্ঘ পূর্ণসংখ্যা: 4 বাইট
  • দীর্ঘ দীর্ঘ পূর্ণসংখ্যা: 8 বাইট
  • পূর্ণসংখ্যা: সংকলকটির উপর নির্ভর করে (16 বিট, 32 বিট, বা 64 বিট)

11
ভুয়া, এগুলি সমস্তই অন্য কোনও উত্তরের বর্ণিত ন্যূনতম ব্যাপ্তিগুলির সাথে আর্কিটেকচার থেকে নির্ভর করে। কিছুই একটি বাস্তবায়ন short, intএবং longসমস্ত 32 বিট পূর্ণসংখ্যা থামায় না ।
মাত্তেও ইটালিয়া

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