সি ++ এ "লং", "লং লং", "লং লং" এবং "লং লং ইনট" এর মধ্যে পার্থক্য কী?


209

আমি জাভা থেকে সি ++ এ রূপান্তর করছি এবং longডেটা টাইপ সম্পর্কে কিছু প্রশ্ন আছে । জাভাতে, 2 32 এর চেয়ে বেশি পূর্ণসংখ্যার ধারণ করতে, আপনি কেবল লিখতে পারেন long x;। যাইহোক, সি ++ এ, এটি longএকটি ডেটা টাইপ এবং একটি সংশোধক উভয়ই বলে মনে হয়।

ব্যবহার করার বিভিন্ন উপায় রয়েছে বলে মনে হচ্ছে long:

long x;
long long x;
long int x;
long long int x;

এছাড়াও, মনে হয় এখানে কিছু রয়েছে:

long double x;

ইত্যাদি।

এই বিভিন্ন ধরণের ডেটা টাইপের মধ্যে পার্থক্য কী এবং সেগুলির কি একই উদ্দেশ্য রয়েছে?



2
@ ব্যবহারকারী 2612743 - নিরাপদ থাকতে আপনার প্রয়োজনীয়তাগুলি কী তা সম্পর্কে ভাবুন এবং উপযুক্ত প্রকারটি ব্যবহার করুন। long longএর চেয়ে ধীর হতে পারে long, যা ধীর হতে পারে int
পিট বেকার


1
না, "নিরাপদ থাকার জন্য, দীর্ঘ দীর্ঘ ব্যবহার করুন" বলার মতোই "নিরাপদ থাকতে, সবাইকে একটি পৃথিবী এইডস দিন, তাই আমাদের নিরাপদ যৌন সম্পর্কে চিন্তা করার দরকার নেই, আমরা সবাই ইতিমধ্যে এটি পেয়েছি!" বোকা, না? ডেটা এবং এটিতে কী কী সম্ভাব্য মান থাকতে পারে সে সম্পর্কে চিন্তাভাবনা করুন এবং সর্বোত্তম-উপযুক্ততার ধরণটি ব্যবহার করুন। এটি মূল কোডের উদ্দেশ্যটি ভঙ্গ না করে সংযোজনকারীটিকে অতিরিক্ত অনুকূলকরণ করতে সহায়তা করে, যেমন লক্ষ্য প্ল্যাটফর্মের প্রাকৃতিক বিট-প্রস্থের চেয়ে বড় সংখ্যাগুলি হ্যান্ডেল করতে অতিরিক্ত লাইব্রেরি লোড করতে হয়।
সিএম

উইন32 লিস্টবক্সগুলি সহ দীর্ঘ দীর্ঘ ব্যবহার করা এবং এর মতো আপনার স্মৃতি এবং অন্যান্য পরিবর্তনশীলগুলির সাথে সর্বনাশ খেলতে পারা যায় না - এমনকি সীমাটি ভঙ্গ না করা হলেও। এমনকি নির্দোষ চেহারা C4244 সতর্কতা সহ এটি সনাক্ত করা সহজ নয়।
লরি স্টার্ন

উত্তর:


182

longএবং long intঅভিন্ন। তাই হয় long longএবং long long int। উভয় ক্ষেত্রেই, intবিকল্প is

দুটি সেট মধ্যে পার্থক্য হিসেবে সি ++ প্রতিটি মান ম্যান্ডেট ন্যূনতম রেঞ্জ, এবং যে long longহয় অন্তত ওয়াইড যত long

স্ট্যান্ডার্ডের নিয়ন্ত্রণকারী অংশগুলি (সি ++ 11, তবে এটি দীর্ঘকাল ধরে চলেছে) একটির জন্য 3.9.1 Fundamental types, বিভাগ 2 (পরবর্তী বিভাগটি স্বাক্ষরবিহীন ইন্টিগ্রাল ধরণের জন্য একই নিয়ম দেয়):

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

এখানে একটি সারণী 9 রয়েছে 7.1.6.2 Simple type specifiers, যা প্রকৃত প্রকারের সাথে নির্দিষ্টকরণকারীদের "ম্যাপিংস" দেখায় (এটি বিকল্পটি দেখায় int), যার একটি অংশ নীচে দেখানো হয়েছে:

Specifier(s)         Type
-------------    -------------
long long int    long long int
long long        long long int
long int         long int
long             long int

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

সুতরাং আপনার longনিজের প্রশ্ন হিসাবে এটি নিজেই কোনও প্রকার বা সংশোধক নয় , এটি কেবল long intপ্রকারের জন্য নির্দিষ্টকরণকারী । ধরণের long longজন্য একটি নির্দিষ্টকরণকারী হিসাবে Ditto long long int

যদিও সি ++ স্ট্যান্ডার্ড নিজেই অবিচ্ছেদ্য ধরণের ন্যূনতম ব্যাপ্তি নির্দিষ্ট করে না, এটি 1.2 Normative referencesপ্রয়োগ হিসাবে C99 হিসাবে উল্লেখ করে। তাই নির্ধারিত ন্যূনতম ব্যাপ্তি C99 5.2.4.2.1 Sizes of integer types <limits.h>প্রযোজ্য।


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


4
সাথে একই জিনিস unsignedএবংunsigned int
কাল

2
আমি নিশ্চিত longযে কমপক্ষে 32 বিট (শূন্যের উভয় দিকে 2 ^ 31-1) এবং long longকমপক্ষে 64৪ (উভয় পক্ষের 2 ^ 63-1)।
ক্রিস

2
এবং long doubleঅন্তত পরিসীমা থাকার গ্যারান্টিযুক্ত doubleতবে এটি একই হতে পারে। এটি কম্পিউটারের উপর নির্ভর করে। কিছু এফপিইউ যথার্থতা বাড়িয়েছে; x87 চিপগুলিতে 32-বিট একক নির্ভুলতা, 64-বিট ডাবল যথার্থতা এবং 80-বিট বর্ধিত নির্ভুলতা ছিল।
এরিক জাবলো

পরিসীমা প্রয়োজনীয়তা হিসাবে, C ++ 11 স্ট্যান্ডার্ড C11 মান উল্লেখ করে, যার প্রকৃত ব্যাপ্তি রয়েছে।
ক্রিস

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

64

দীর্ঘ এবং দীর্ঘতম অন্তত 32 বিট হয়।

দীর্ঘ দীর্ঘ এবং দীর্ঘ দীর্ঘ int কমপক্ষে its৪ বিট। আপনি অবশ্যই একটি c99 সংকলক বা আরও ভাল ব্যবহার করা উচিত।

লম্বা ডাবলগুলি কিছুটা বিজোড়। বিস্তারিত জানার জন্য তাদের উইকিপিডিয়ায় দেখুন।


17

longসমান long int, ঠিক যেমন shortসমান short int। এ long intহ'ল একটি স্বাক্ষরিত ইন্টিগ্রাল টাইপ যা কমপক্ষে 32 বিট হয়, যখন একটি long longবা long long intস্বাক্ষরিত ইন্টিগ্রাল টাইপ কমপক্ষে 64৪ বিট হয়।

এর অর্থ অগত্যা এই নয় যে এটি একটি এর long longচেয়ে বৃহত্তর long। অনেক প্ল্যাটফর্ম / এবিআই LP64মডেল ব্যবহার করে - যেখানে long(এবং পয়েন্টারগুলি) 64 বিট প্রশস্ত। উইন 64 ব্যবহার করে LLP64, যেখানে longএখনও 32 বিট রয়েছে এবং long long(এবং পয়েন্টারগুলি) 64 বিট প্রশস্ত।

সেখানে 64-বিট ডাটা মডেলের একটি ভাল সারাংশ এখানে

long doubleএটি কমপক্ষে যতটা প্রশস্ত হবে তার চেয়ে অনেক বেশি গ্যারান্টি দেয় না double


7

এটি বিভ্রান্ত দেখাচ্ছে কারণ আপনি longনিজেই ডেটাটাইপ হিসাবে নিচ্ছেন ।

longlong intআপনি যখন এটি একা ব্যবহার করছেন তখন কেবলমাত্র শর্টহ্যান্ড ছাড়া কিছুই নয় ।

longএকটি পরিবর্তনকারী, আপনি এটি doubleহিসাবে এটি ব্যবহার করতে পারেন long double

long== long int

দু'জনেই 4 বাইট নেয়।


4 বাইট বেশি সময় নেওয়া কেবল
উইন 64 এ

1
হ্যাঁ স্পষ্টতই ... কেবল দীর্ঘ নয় ... চারটি বাইট এবং 2 বাইট প্ল্যাটফর্মের উপর নির্ভর করে, কোনও সন্দেহ নেই।
সিরাজ আলম

3

Icallyতিহাসিকভাবে, সি শুরুর দিকে, যখন প্রসেসরের 8 বা 16 বিট শব্দদৈর্ঘ্য intছিল , আজকের মতো short(16 বিট) ছিল। একটি নির্দিষ্ট অর্থে, int- এ বেশি বিমূর্ত ডাটা টাইপ হল char, short, longবা long long, যেমন আপনি কি নিশ্চিতরূপে bitwidth সম্পর্কে হতে পারে না।

সংজ্ঞায়িত করার সময় int n;আপনি এটি অনুবাদ করতে পারেন "আমাকে N এর জন্য এই মেশিনে বিটউইথ এবং গতির সর্বোত্তম সমঝোতা দিন"। ভবিষ্যতে হয়ত আপনার আশা করা উচিত যে সংকলকরা অনুবাদটি int64 বিটের হয়ে যাবে। সুতরাং যখন আপনি চান আপনার ভেরিয়েবলের 32 বিট থাকতে হবে এবং আরও বেশি নয়, longডেটা টাইপ হিসাবে স্পষ্টভাবে ব্যবহার করুন ।

[সম্পাদনা: #include <stdint.h>বিটউইদথগুলি নিশ্চিতকরণের সঠিক উপায় বলে মনে হচ্ছে # # _ t প্রকার ব্যবহার করে, যদিও এটি এখনও স্ট্যান্ডার্ডের অংশ নয়]]


2
যখন শেষ অংশটি 32-বিট পেতে যখন "বিট" হয় তখন "লং" ব্যবহার করে ভুল হয়। যদি int 64৪-বিট হয় তবে লম্বা কমপক্ষে 64৪-বিটও হবে। লং কমপক্ষে ইন্টের মতো বৃহত্তর হওয়ার গ্যারান্টিযুক্ত , যদিও এটি বৃহত্তর হতে পারে তবে কখনও ছোট নয়। বেশিরভাগ সংকলকের বিভিন্ন পদ্ধতি রয়েছে যা প্রোগ্রামারকে আরও নির্দিষ্ট হতে দেয় যেমন একটি (নন-পোর্টেবল) __int32 টাইপ যা হুবহু 32-বিট, ইত্যাদি।
সিএম

1
সি স্ট্যান্ডার্ডে সংজ্ঞায়িত হিসাবে, একটি কমপক্ষে 32 বিট হওয়ারlong গ্যারান্টিযুক্ত । (স্ট্যান্ডার্ডগুলি শক্তভাবে পরিবর্তন করতে পারে)) বর্তমান সি ++ 14 খসড়াটি কেবলমাত্র বলেছে: @ সিএম "সমতল ইনটসের প্রাকৃতিক আকারটি কার্যকর পরিবেশের আর্কিটেকচারের দ্বারা প্রস্তাবিত অন্যান্য স্বাক্ষরিত পূর্ণসংখ্যার ধরণের বিশেষ চাহিদা পূরণের জন্য সরবরাহ করা হয়" (বিভাগ 3.9.1 )। এর মধ্যে বিভিন্ন ইনটগুলির দৈর্ঘ্যের সম্পর্কের বিষয়ে আমি কোনও শব্দ পাইনি। __int32 আসলেই এই স্ট্যান্ডার্ডের অংশ নয়, তবে সি ++ 11 সাল থেকে টাইপডেফগুলি যেমন int_fast32_t বা int_least32_t এর মতো পাওয়া যায় যা আপনি চান ঠিক তাই পেতে পারেন।
থোমিয়েল

আমি বলতে পারি যে বিংশ শতাব্দীর সাধারণ উদ্দেশ্যে পুনঃপ্রণয়নযোগ্য মাইক্রোকম্পিউটারগুলির বাস্তবায়নগুলি charপ্রায় সর্বসম্মতিক্রমে 8 বিট shortছিল, 16 এবং long32 বছর ছিল; intহয় 16 বা 32 হতে পারে some কিছু প্ল্যাটফর্মের জন্য দ্রষ্টব্য (উদাহরণস্বরূপ 68000) 16-বিট এবং 32-বিট intউভয়ই প্রচলিত ছিল এবং প্রকৃতপক্ষে কিছু সংকলককে সমর্থন করার বিকল্প ছিল। যে কোডটি বহনযোগ্য হতে হবে এটি ব্যবহার করা shortবা তার longপছন্দ হিসাবে প্রত্যাশিত ছিল int
সুপারক্যাট

0

জাভাতে longসর্বদা b৪ বিট থাকে, সি ++ এ এটি কম্পিউটার আর্কিটেকচার এবং অপারেটিং সিস্টেমের উপর নির্ভর করে । উদাহরণস্বরূপ, একটি longলিনাক্সে 64৪ বিট এবং উইন্ডোজে 32 বিট (এটি ব্যাকওয়ার্ড-সামঞ্জস্যতা বজায় রাখার জন্য করা হয়েছিল, 32-বিট প্রোগ্রামগুলিকে কোনও পরিবর্তন ছাড়াই 64৪-বিট উইন্ডোজে সংকলন করার অনুমতি দেওয়া হয়েছিল)।

এড়াতে short int long ... এবং পরিবর্তে এটি ব্যবহার করা ভাল সি ++ স্টাইল হিসাবে বিবেচিত হয় :

std::int8_t   # exactly  8 bits
std::int16_t  # exactly 16 bits
std::int32_t  # exactly 32 bits
std::int64_t  # exactly 64 bits

std::size_t   # can hold all possible object sizes, used for indexing

এই ( int*_t)গুলি <cstdint>শিরোনাম অন্তর্ভুক্ত করার পরে ব্যবহার করা যেতে পারে । size_tহয় <stdlib.h>

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