সি ++ এ কোন int এবং দীর্ঘের মধ্যে পার্থক্য কী?


120

আমি ভুল হলে আমাকে সংশোধন করুন,

ইন্টি 4 বাইট, -2,147,483,648 থেকে 2,147,483,647 (2 ^ 31)
পর্যন্ত 4-বাইট, -2,147,483,648 থেকে 2,147,483,647 (2 ^ 31) এর মানের ব্যাপ্তি সহ 4 বাইট

সি ++ এর মধ্যে পার্থক্য কী? এগুলি কি বিনিময়যোগ্যভাবে ব্যবহার করা যায়?


আমার VS2005 32 বিট প্রসেসরে চলমান, পূর্বনির্ধারার ডিফল্ট আকার 4 বাইট।


আপনি যদি পোর্টেবল কোড লিখতে চান #include <stdint.h>তবে ব্যবহারের বিষয়ে বিবেচনা করুন এবং তারপরে আকারগুলি বলুন। যেমন uint32_t। একটি নতুন প্ল্যাটফর্মে, তারপরে আপনাকে অবশ্যই নিশ্চিত করতে হবে যে stdint.h particular নির্দিষ্ট প্ল্যাটফর্মের জন্য এটি ঠিক হয়ে যায় এবং আপনার কোডটি ইচ্ছাকৃতভাবে কাজ করে।
বিটিক্লার

উত্তর:


112

এটি বাস্তবায়ন নির্ভর।

উদাহরণস্বরূপ, উইন্ডোজের অধীনে সেগুলি একই, তবে আলফা সিস্টেমে উদাহরণস্বরূপ দীর্ঘ 64৪ বিট ছিল এবং ইন্টি 32 বিট ছিল। এই নিবন্ধটি চলক প্ল্যাটফর্মগুলিতে ইন্টেল সি ++ সংকলনের নিয়মগুলি কভার করে। সংক্ষেপ:

  OS           arch           size
Windows       IA-32        4 bytes
Windows       Intel 64     4 bytes
Windows       IA-64        4 bytes
Linux         IA-32        4 bytes
Linux         Intel 64     8 bytes
Linux         IA-64        8 bytes
Mac OS X      IA-32        4 bytes
Mac OS X      Intel 64     8 bytes  

আমি মনে করি আমাদের সি ++ স্ট্যান্ডার্ড সম্পর্কিত নীচে কিছু বিবরণের সাথে এই উত্তরটি (উদাহরণস্বরূপ একটি উত্তর) একত্রিত করার কথা বিবেচনা করা উচিত। সি ++ 0 এক্স এর খসড়াটি ওপেন-স্টাডি.আর.আর.জি.সি 1 / এসসি 22/WG21/docs/papers/2008/n2798.pdfরয়েছে এবং এটি চিহ্নিত করা হয়েছে যাতে আপনি এটি এবং শেষ রেভার মধ্যে পার্থক্য দেখতে পারবেন can
প্যাট্রিক জনমেয়ার

প্রকারের আপেক্ষিক আকার অনুসারে ক্রমযুক্ত কিছু অন্তর্ভুক্ত করে বিভিন্ন প্ল্যাটফর্মের আকারগুলি গণনা করার চেয়ে আরও বেশি তথ্য পাওয়া যায় - যেমন @ কেভিন খুব সুন্দরভাবে বলেছেন। (-1 ভোট)
xtofl

2
কিছু সংকলকের এমনকি এমন পতাকাও রয়েছে যা আপনাকে পূর্বনির্ধারিত এবং দীর্ঘতর আকারের ডিফল্ট আকার পরিবর্তন করতে দেয় ie এগুলি 8 বা 16 এ বাধ্য করে etc. ইত্যাদি বিবরণের জন্য আপনি সংকলক ডকুমেন্টেশন দেখুন।
মার্টিন ইয়র্ক

7
এনবি যে এগুলি দীর্ঘ
রজারডপ্যাকের

1
পাশাপাশি ইন্টের মাপগুলি অন্তর্ভুক্ত করুন।
শেগপ্রকাশ

82

আপনার একমাত্র গ্যারান্টি হ'ল:

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

// FROM @KTC. The C++ standard also has:
sizeof(signed char)   == 1
sizeof(unsigned char) == 1

// NOTE: These size are not specified explicitly in the standard.
//       They are implied by the minimum/maximum values that MUST be supported
//       for the type. These limits are defined in limits.h
sizeof(short)     * CHAR_BIT >= 16
sizeof(int)       * CHAR_BIT >= 16
sizeof(long)      * CHAR_BIT >= 32
sizeof(long long) * CHAR_BIT >= 64
CHAR_BIT         >= 8   // Number of bits in a byte

আরও দেখুন: কমপক্ষে 32 বিট হওয়ার নিশ্চয়তা আছে কি long?


1
হুম, এটি ধারণ করে না, যদি মাপের (সংক্ষিপ্ত)> = আকারে (চর) আমরা কেবলমাত্র সেই মাপের (সংক্ষিপ্ত)> = 1 (নয়> = 2) জানি, যা বিটিডব্লু সমস্ত ধরণের জন্য যায়। এই আকার অনুসারে (যে কোনও অবিচ্ছেদ্য প্রকার)> = 1. যা সত্য, উদাহরণস্বরূপ আমি Z80 এর মাপের (int) == 1 মনে রাখি, তবে কি আর এর চেয়ে শক্তিশালী কোন গ্যারান্টি নেই?
আন্দ্রেয়াস ম্যাগনুসন

6
সি ++ স্ট্যান্ডার্ডের ৩.৯.১.২ সি ++ স্ট্যান্ডার্ডের মাপের (দীর্ঘ)> = আকারের (অন্তর্)> = আকারের (সংক্ষিপ্ত)> = আকারের (চার্ট) 5.3.3.1 নির্দিষ্ট করে যে আকার (চর), আকার (স্বাক্ষরবিহীন চর) , এবং আকারের (স্বাক্ষরিত চর) সমান 1 (সমাপ্তি ...)
কেটিসি

4
(... অব্যাহত) অবিচ্ছেদ্য ধরণের দ্বারা প্রতিনিধিত্বযোগ্য সর্বাধিক এবং ন্যূনতম মানগুলি <সীমা>> এ ম্যাক্রো হিসাবে সংজ্ঞায়িত হয়েছে (এবং তাই <ক্লিটস>)। সি (1990) স্ট্যান্ডার্ডের এনেক্সেক্স ই, যা সি ++ স্ট্যান্ডার্ড থেকে রেফারেন্স সহ অন্তর্ভুক্ত রয়েছে, এই ম্যাক্রোগুলির ন্যূনতম মাপদণ্ড নির্দিষ্ট করে। (চলমান ...)
কেটিসি

4
(... ধারাবাহিক) এবং সেগুলি হ'ল (2 ^ 15) -1, (2 ^ 15) -1, (2 ^ 31) -1, যথাক্রমে সংক্ষিপ্ত, আন্ত এবং দীর্ঘ জন্য, যা মান হিসাবে কার্যকর হয় CHAR_BIT 8 হয় (যা এটির সর্বনিম্ন মানও হয়) তার প্রতিক্রিয়ায় মার্টিন ইয়র্ক পোস্ট করেছেন এখানে।
কেটিসি

2
@ গাইলস: আমি উপরে যা বলেছিলাম তা কি তাই না? মাপের (সংক্ষিপ্ত) * CHAR_BITS> = 16. কয়েকটি অন্যান্য জিনিস প্লাস্ট করুন। :-)
মার্টিন ইয়র্ক

13

X64 এর জন্য সংকলন করার সময় আপনি কোন সংকলকটি ব্যবহার করেন তার উপর নির্ভর করে ইনট এবং দীর্ঘের মধ্যে পার্থক্যটি কোথাও 0 এবং 4 বাইটের মধ্যে রয়েছে।

জিসিসি এলপি 64 মডেলটি ব্যবহার করে যার অর্থ ইনটগুলি 32-বিট তবে লম্বা 64৪ বিট মোডের আওতায় 64-বিট।

উদাহরণস্বরূপ, এমএসভিসি এলএলপি 64৪ মডেল ব্যবহার করে, যার অর্থ ইনট এবং লম্বা উভয়ই 64৪-বিট মোডে এমনকি 32-বিট।


সম্ভবত 0 বাইট? হুম
rogerdpack

12

সি ++ নিজেই স্পেসিফিকেশন (পুরোনো সংস্করণ কিন্তু এই জন্য ভাল যথেষ্ট) এই খোলা ছেড়ে।

চারটি স্বাক্ষরিত পূর্ণসংখ্যার প্রকার রয়েছে: ' signed char', ' short int', ' int' এবং ' long int'। এই তালিকায়, প্রতিটি ধরণের তালিকাটিতে পূর্ববর্তীগুলির মতো কমপক্ষে স্টোরেজ সরবরাহ করে। সরল ints কার্যকর পরিবেশের আর্কিটেকচার দ্বারা প্রস্তাবিত প্রাকৃতিক আকার আছে *;

[পাদটীকা: এটি শিরোনামে সংজ্ঞায়িত হিসাবে INT_MIN এবং INT_MAX এর পরিসরের কোনও মান ধারণ করার পক্ষে যথেষ্ট বড় <climits>। --- শেষ ফুনোট]


7

কেভিন হেইনেস হিসাবে উল্লেখ করেছেন, কালিগুলিতে কার্যকর কার্যকর পরিবেশ দ্বারা প্রস্তাবিত প্রাকৃতিক আকার রয়েছে, যা INT_MIN এবং INT_MAX এর মধ্যে ফিট করতে পারে fit

C89 স্ট্যান্ডার্ডে বলা হয়েছে যে UINT_MAXকমপক্ষে 2 ^ 16-1, USHRT_MAX2 ^ 16-1 এবং ULONG_MAX2 ^ 32-1 হওয়া উচিত। এটি সংক্ষিপ্ত এবং int এর জন্য কমপক্ষে 16 এবং দীর্ঘ সময়ের জন্য 32-এর বিট-কাউন্ট করে। চরের জন্য এটি স্পষ্টভাবে জানিয়েছে যে এটির কমপক্ষে 8 বিট ( CHAR_BIT) হওয়া উচিত । C ++ সীমাবদ্ধতা ফাইলের জন্য এই বিধিগুলি উত্তরাধিকার সূত্রে প্রাপ্ত, সুতরাং সি ++ এ আমাদের সেই মানগুলির জন্য একই মৌলিক প্রয়োজনীয়তা রয়েছে। তবে আপনার সেই অন্তর্গতটি কমপক্ষে 2 বাইট থেকে নেওয়া উচিত নয় । তাত্ত্বিকভাবে, চর, ইনট এবং লম্ব সবগুলি 1 বাইট হতে পারে, যার ক্ষেত্রে CHAR_BITঅবশ্যই কমপক্ষে 32 হওয়া উচিত Just কেবল মনে রাখবেন যে "বাইট" সর্বদা একটি চরের আকার হয়, তাই যদি চর বড় হয় তবে বাইট কেবল 8 বিট নয় আরও অনেক কিছু।


আমি ভাবিনি যে byteসি ++ তে কোনও ডেটা টাইপ বিদ্যমান। এটা না, তাই না? যদি এটি হয় এবং byteএকটিতে 8 টি বিট বাদে অন্য আকারের আকার থাকতে পারে তবে এটি খাঁটি মূর্খ। এটি একেবারে অগত্যা 8 বিট না করে কেন এটাকে বাইট বলবে?
অ্যালাদারথ

6

এটি আপনার সংকলকের উপর নির্ভর করে। আপনি গ্যারান্টিযুক্ত যে একটি দৈর্ঘ্য অন্তত অন্তত পরিমাণ হিসাবে বৃহত্তর হবে, কিন্তু আপনি গ্যারান্টিযুক্ত না যে এটি আর আর থাকবে।


5

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

আপনি আন্ত এবং দীর্ঘ বিনিময়যোগ্যভাবে ব্যবহার করতে পারবেন না কারণ কারণ তারা সর্বদা একই দৈর্ঘ্য হয় না। সি একটি PDP-11 এ আবিষ্কার হয়েছিল যেখানে একটি বাইটে 8 বিট ছিল, int দুটি বাইট ছিল এবং হার্ডওয়্যার নির্দেশাবলী দ্বারা সরাসরি পরিচালনা করা যেতে পারে। যেহেতু সি প্রোগ্রামারগুলিতে প্রায়শই চার-বাইট পাটিগণিতের প্রয়োজন হত, দীর্ঘ উদ্ভাবিত হয়েছিল এবং এটি চারটি বাইট ছিল, যা গ্রন্থাগারের ফাংশন দ্বারা পরিচালিত ছিল। অন্যান্য মেশিনের আলাদা আলাদা স্পেসিফিকেশন ছিল। সি স্ট্যান্ডার্ড কিছু ন্যূনতম প্রয়োজনীয়তা আরোপ করে।


5

সংকলক বিক্রেতার আদিম ধরণের আকারের বাস্তবায়নের উপর নির্ভর করে আপনি যদি কখনও কোনও মেশিন আর্কিটেকচার, ওএস, বা অন্য কোনও বিক্রেতার সংকলকটিতে আপনার কোডটি সংকলন করেন তবে আপনাকে তাড়িত করতে ফিরে আসবে।

বেশিরভাগ সংকলক বিক্রেতারা একটি শিরোনাম ফাইল সরবরাহ করে যা প্রকারভেদ আকারের সাথে আদিম ধরণের সংজ্ঞা দেয়। এই আদিম ধরণেরগুলি ব্যবহার করা উচিত যখন কোনও কোড সম্ভাব্যভাবে অন্য সংকলককে পোর্ট করা যেতে পারে (এটিকে সর্বদা সর্বদা হিসাবে পড়ুন)। উদাহরণস্বরূপ, বেশিরভাগ ইউনিক্স সংকলক রয়েছে int8_t uint8_t int16_t int32_t uint32_t। মাইক্রোসফ্ট আছে INT8 UINT8 INT16 UINT16 INT32 UINT32। আমি বোরল্যান্ড / কোডগিয়ারকে পছন্দ করি int8 uint8 int16 uint16 int32 uint32 । এই নামগুলিও इच्छित মানের আকার / ব্যাপ্তির সামান্য অনুস্মারক দেয়।

কয়েক বছর ধরে আমি বোরল্যান্ডের সুস্পষ্ট আদিম ধরণের নাম এবং #includeনিম্নলিখিত সি / সি ++ শিরোনাম ফাইল (প্রিমিটি.এইচ) ব্যবহার করেছি যা কোনও সি / সি ++ সংকলকের জন্য এই নামের সাথে সুস্পষ্ট আদিম ধরণের সংজ্ঞায়িত করার উদ্দেশ্যে করা হয়েছে (এই শিরোলেখের ফাইলটি অবশ্যই প্রতিটি কভার করতে পারে না) সংকলক তবে এটি উইন্ডোজ, ইউএনআইএক্স এবং লিনাক্সে আমি ব্যবহার করেছি এমন কয়েকটি সংকলককে কভার করে, এটি (এখনও) 64 বিট প্রকারের সংজ্ঞা দেয় না)।

#ifndef primitiveH
#define primitiveH
// Header file primitive.h
// Primitive types
// For C and/or C++
// This header file is intended to define a set of primitive types
// that will always be the same number bytes on any operating operating systems
// and/or for several popular C/C++ compiler vendors.
// Currently the type definitions cover:
// Windows (16 or 32 bit)
// Linux
// UNIX (HP/US, Solaris)
// And the following compiler vendors
// Microsoft, Borland/Imprise/CodeGear, SunStudio,  HP/UX
// (maybe GNU C/C++)
// This does not currently include 64bit primitives.
#define float64 double
#define float32 float
// Some old C++ compilers didn't have bool type
// If your compiler does not have bool then add   emulate_bool
// to your command line -D option or defined macros.
#ifdef emulate_bool
#   ifdef TVISION
#     define bool int
#     define true 1
#     define false 0
#   else
#     ifdef __BCPLUSPLUS__
      //BC++ bool type not available until 5.0
#        define BI_NO_BOOL
#        include <classlib/defs.h>
#     else
#        define bool int
#        define true 1
#        define false 0
#     endif
#  endif
#endif
#ifdef __BCPLUSPLUS__
#  include <systypes.h>
#else
#  ifdef unix
#     ifdef hpux
#        include <sys/_inttypes.h>
#     endif
#     ifdef sun
#        include <sys/int_types.h>
#     endif
#     ifdef linux
#        include <idna.h>
#     endif
#     define int8 int8_t
#     define uint8 uint8_t
#     define int16 int16_t
#     define int32 int32_t
#     define uint16 uint16_t
#     define uint32 uint32_t
#  else
#     ifdef  _MSC_VER
#        include <BaseTSD.h>
#        define int8 INT8
#        define uint8 UINT8
#        define int16 INT16
#        define int32 INT32
#        define uint16 UINT16
#        define uint32 UINT32
#     else
#        ifndef OWL6
//          OWL version 6 already defines these types
#           define int8 char
#           define uint8 unsigned char
#           ifdef __WIN32_
#              define int16 short int
#              define int32 long
#              define uint16 unsigned short int
#              define uint32 unsigned long
#           else
#              define int16 int
#              define int32 long
#              define uint16 unsigned int
#              define uint32 unsigned long
#           endif
#        endif
#      endif
#  endif
#endif
typedef int8   sint8;
typedef int16  sint16;
typedef int32  sint32;
typedef uint8  nat8;
typedef uint16 nat16;
typedef uint32 nat32;
typedef const char * cASCIIz;    // constant null terminated char array
typedef char *       ASCIIz;     // null terminated char array
#endif
//primitive.h

সি -৯৯ ম্যান্ডেট যা টাইপডিফগুলি দেখতে ইন্টিও32_t, uint64_t ইত্যাদির মতো দেখতে সংকলক দ্বারা সংজ্ঞায়িত করা হয় এবং নাম অনুসারে ঠিক তত বিট থাকে। বেশিরভাগ সি ++ সংকলক (জি ++ সহ) আপনাকে সি ++ কোডে এই ধ্রুবকগুলি ব্যবহার করতে পারবেন।
rmeador

5

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

৩.৯.১০, §২:

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

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

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.