64-বিট উইন্ডোজে দীর্ঘ বিট আকারটি কত?


137

খুব বেশি দিন আগে, কেউ আমাকে বলেছিল যে longbit৪ বিট মেশিনে b৪ বিট নয় এবং আমার সর্বদা ব্যবহার করা উচিত int। এটি আমার কাছে কোনও অর্থবহ হয়নি। আমি ডকস দেখেছি (যেমন অ্যাপলের অফিসিয়াল সাইটের মধ্যে একটি) বলে যে long64৪ বিট সিপিইউ সংকলনের সময় indeed৪ বিট প্রকৃতপক্ষে। আমি এটি 64-বিট উইন্ডোতে যা ছিল তা খুঁজে পেয়েছি

  • উইন্ডোজ: longএবং int32-বিট দৈর্ঘ্যে থেকে যায় এবং বিশেষ নতুন ডেটা টাইপগুলি 64-বিট পূর্ণসংখ্যার জন্য সংজ্ঞায়িত করা হয়।

( http://www.intel.com/cd/ids/developer/asmo-na/eng/197664.htm?page=2 থেকে )

আমার কী ব্যবহার করা উচিত? আমি ভালো কিছু সংজ্ঞায়িত করা উচিত uw, swযেমন একটি ((UN) স্বাক্ষরিত প্রস্থ) longনা Windows এ যদি, এবং অন্যথায় লক্ষ্য CPU- র bitsize উপর একটি চেক করবেন না?


উইন্ডোজটিতে এমএসভিসি ++ ইন্টি এবং লম্বা 32-বিট: এমএসডিএন.মিক মাইক্রোসফট /en-us/library/3b2e7499.aspx । তবে, উদাহরণস্বরূপ ভেক্টরগুলিকে 4G এর বেশি আইটেম সংরক্ষণ করার অনুমতি দিতে, আকার_টি 64 বিট। সুতরাং একজনের পুনরাবৃত্তি করার জন্য int এর পরিবর্তে int64_t ব্যবহার করা দরকার যেমন ভেক্টরগুলিতে 4G এর বেশি আইটেম থাকতে পারে।
সার্জ রোগাচ


@SergeRogatch তারা ব্যবহার করা উচিত size_tবা পুনরুক্তি করতে কোনো ইটারেটরে ধরন, না intবাint64_t
phuclv

2
@ লুভানহফ্যাক, size_tএটি নেতিবাচক সংখ্যার কাছাকাছি হয়ে ওঠে কারণ size_tস্বাক্ষরযুক্ত নয়। সুতরাং for(size_t i=0; i<v.size()-2; i++)ভেক্টর আকার 0 এবং 1 এর আরেকটি উদাহরণ ব্যর্থ: for(size_t i=v.size()-1; i>=0; i--)
সার্জ রোগাচ

2
আপনি যদি পয়েন্টারে গাণিতিক কাজ করে থাকেন (উদাহরণস্বরূপ size_tমান সহ তবে ফলাফলটি একটি ptrdiff_tধরণের পরিবর্তে রাখা উচিত - যা এই জাতীয় ফলাফলের জন্য যথেষ্ট বড় আকারের জন্য ডিজাইন করা হয়েছে এবং সুনির্দিষ্ট কারণের জন্য এটি একটি স্বাক্ষরিত টাইপ!)
স্লাইসভেন

উত্তর:


261

ইউনিক্স বিশ্বে, 64-বিট প্ল্যাটফর্মের আকার এবং সংখ্যার পয়েন্টারগুলির জন্য কয়েকটি সম্ভাব্য ব্যবস্থা ছিল। দুটি বেশিরভাগ ক্ষেত্রে ব্যবহৃত হয় হ'ল আইএলপি 64৪ (আসলে, এর খুব কম কয়েকটি উদাহরণ; ক্রে এমনই একটি ছিল) এবং এলপি (৪ (প্রায় সব কিছুর জন্য)। সংক্ষিপ্ত আকারগুলি 'ইনট, দীর্ঘ, পয়েন্টারগুলি 64-বিট' এবং 'দীর্ঘ, পয়েন্টারগুলি 64-বিট' থেকে আসে।

Type           ILP64   LP64   LLP64
char              8      8       8
short            16     16      16
int              64     32      32
long             64     64      32
long long        64     64      64
pointer          64     64      64

আইএলপি 64৪ সিস্টেমটি এলপি 64৪ এর পক্ষে ছেড়ে দেওয়া হয়েছিল (এটি প্রায় পরবর্তী সমস্ত প্রবেশকারীরা এলপি 6464 ব্যবহার করেছিল, এস্পেন গ্রুপের সুপারিশের ভিত্তিতে; কেবলমাত্র -৪-বিট অপারেশনের দীর্ঘ heritageতিহ্যযুক্ত সিস্টেমগুলি আলাদা স্কিম ব্যবহার করে)। সমস্ত আধুনিক -৪-বিট ইউনিক্স সিস্টেম এলপি 64 ব্যবহার করে। ম্যাকস এক্স এবং লিনাক্স উভয়ই আধুনিক -৪-বিট সিস্টেম।

মাইক্রোসফ্ট 64৪-বিটে স্থানান্তরিত করার জন্য একটি পৃথক স্কিম ব্যবহার করে: এলএলপি 64 ('দীর্ঘ দীর্ঘ, পয়েন্টারগুলি 64-বিট') are এর অর্থের যোগ্যতা রয়েছে যে 32-বিট সফটওয়্যারটি পরিবর্তন ছাড়াই পুনরায় সংযুক্ত করা যায়। এটির প্রত্যেকে যা কিছু করে তার থেকে আলাদা হওয়ার মানসিকতা রয়েছে এবং 64৪-বিট ক্ষমতার ব্যবহারের জন্য কোডও সংশোধন করা দরকার। সর্বদা সংশোধন প্রয়োজনীয় ছিল; এটি ইউনিক্স প্ল্যাটফর্মগুলিতে প্রয়োজনীয় সংশোধনগুলির একটি পৃথক সেট ছিল।

আপনি যদি সফ্টওয়্যারটি প্ল্যাটফর্ম-নিরপেক্ষ পূর্ণসংখ্যার প্রকারের নামগুলির আশেপাশে ডিজাইন করেন, সম্ভবত C99 <inttypes.h>শিরোনাম ব্যবহার করে যা প্ল্যাটফর্মে প্রকারগুলি উপলভ্য থাকে, স্বাক্ষরিত (তালিকাভুক্ত) এবং স্বাক্ষরযুক্ত (তালিকাভুক্ত নয়; 'ইউ' সহ উপসর্গ) সরবরাহ করে:

  • int8_t - 8 বিট পূর্ণসংখ্যা
  • int16_t - 16 বিট পূর্ণসংখ্যা
  • int32_t - 32-বিট পূর্ণসংখ্যা
  • int64_t - -৪-বিট পূর্ণসংখ্যা
  • uintptr_t - স্বাক্ষরবিহীন পূর্ণসংখ্যার পয়েন্টার ধরে রাখতে যথেষ্ট বড়
  • intmax_t- প্ল্যাটফর্মে পূর্ণসংখ্যার বৃহত্তম আকার (এর চেয়ে বড় হতে পারে int64_t)

তারপরে আপনি নিজের অ্যাপ্লিকেশনটিকে এই ধরণের যেখানে গুরুত্বপূর্ণ তা ব্যবহার করে কোডিং করতে পারেন এবং সিস্টেমের ধরণের (যা ভিন্ন হতে পারে) সম্পর্কে খুব যত্নশীল হন। একটি intptr_tপ্রকার রয়েছে - হোল্ড পয়েন্টারগুলির জন্য স্বাক্ষরিত পূর্ণসংখ্যার প্রকার; আপনার এটি ব্যবহার না করা বা দুটি uintptr_tমানের বিয়োগের ফলাফল হিসাবে এটি ব্যবহার করার পরিকল্পনা করা উচিত (ptrdiff_t ) এর ।

তবে, যেমন প্রশ্নটি দেখায় (অবিশ্বাসের সাথে), 64৪-বিট মেশিনে পূর্ণসংখ্যার ডেটা ধরণের আকারের জন্য বিভিন্ন সিস্টেম রয়েছে। অভ্যাস করুন; বিশ্বের পরিবর্তন হবে না।


12
যারা প্রায় যথেষ্ট সময় ধরে ব্যবহার করেছেন তাদের ক্ষেত্রে, -৪-বিট ট্রানজিশনের মাঝামাঝি ৮০-এর দশকের 16-বিট থেকে 32-বিট ট্রানজিশনের কিছুটা সমান্তরাল রয়েছে। এমন কম্পিউটারগুলি ছিল যেগুলি আইএল 32 এবং অন্যান্য ছিল যা এল 32 (পুরানো সমস্যার সাথে নতুন স্বরলিপিটি মানিয়ে নিচ্ছিল)। কখনও কখনও 'ইনট' 16-বিট ছিল, কখনও কখনও 32-বিট।
জোনাথন লেফলার

4
ভুলে যাবেন না যে এটি কেবল সি-ইশ ভাষাতে প্রযোজ্য। অন্যের স্যানির নির্দিষ্টকরণ রয়েছে যেখানে ক) সংকলক লেখকের ডেটাটাইপগুলি উইলি-নিলির আকার চয়ন করার অনুমতি নেই বা খ) ডেটাটাইপগুলির দৈহিক উপস্থাপনা "ফুটো" বা গ) সংখ্যার সবসময় অসীম বড়।
Jörg ডব্লু মিটাগ

2
সত্য - তবে সেই ভাষাগুলির জন্য যা আচরণটি নির্দিষ্ট করে, সেখানে প্রথমে কোনও সমস্যা নেই। উদাহরণস্বরূপ, জাভাতে একটি 'লম্বা' রয়েছে, তবে আকারটি নির্দিষ্ট হয়ে গেছে (-৪-বিট?), সমস্ত প্ল্যাটফর্মে। সুতরাং, কোনও 64-বিট মেশিনে পোর্টিং করার কোনও সমস্যা নেই; আকার পরিবর্তন হয় না।
জোনাথন লেফলার

17
@ টমফোবার: আইএলপি 64 একটি বড় সমস্যা উপস্থাপন করেছে - আপনি 32-বিট টাইপটিকে কী বলে? অথবা, আপনি যদি 32-বিট টাইপ কল করেন তবে আপনি short16-বিট টাইপটিকে কী বলে? এবং আপনি যদি charইউটিএফ -16 ইত্যাদির জন্য 16-বিট টাইপ কল করেন তবে আপনি 8-বিট টাইপটিকে কী বলে? সুতরাং, এলপি using64 ব্যবহার করে আপনাকে 8-বিট char, 16-বিট short, 32-বিট int, 64-বিট longএবং 128-বিটের উপরের দিকে প্রসারিত করার জন্য জায়গাটি long long(যখন?) প্রাসঙ্গিক হয়ে ওঠে। এর পরে, আপনি সি তে নামগুলির চেয়ে 256 এর বেশি ক্ষমতা পেয়েছেন (ভাল, আমি মনে করি আপনি একটি 256-বিট পেতে পারেন intmax_t, এবং কেবলমাত্র আপনি শেষ হয়ে যেতে পারেন)। এলপি to৪ এর যোগ্যতা রয়েছে।
জোনাথন লেফলার

2
হতে পারে এটি আপনার কাছে সুস্পষ্ট, তবে আমি মনে করি এটি লক্ষণীয় যে সি # অন্য সমস্ত কিছুর থেকে পৃথক পূর্ণ আকারের ব্যবহার করে। আমি সম্প্রতি একটি ডিএলএল-এর সাথে ইন্টারফেসিং করতে পেরেছি যেহেতু সি # -৪ -বিট লম্বা ব্যবহার করে ( এমএসডিএন.মাইক্রোসফটকম /en-us/library/ms173105.aspx )।
কমফোলিও

57

প্রশ্নটি মাইক্রোসফ্ট সি ++ সংকলক বা উইন্ডোজ এপিআই সম্পর্কে কিনা তা পরিষ্কার নয়। তবে, কোনও [সি ++] ট্যাগ নেই তাই আমি ধরে নিই এটি উইন্ডোজ এপিআই সম্পর্কিত। উত্তরগুলির মধ্যে কয়েকটি লিঙ্ক পচায় ভুগেছে তাই আমি পাতলা যেতে পারে এমন আরও একটি লিঙ্ক সরবরাহ করছি।


মত উইন্ডোস API ধরনের সম্পর্কে আরও তথ্যের জন্য INT, LONGইত্যাদি সেখানে দুটিই MSDN এ থাকা একটি পৃষ্ঠা হল:

উইন্ডোজ ডেটা প্রকার

তথ্যগুলি বিভিন্ন উইন্ডোজ হেডার ফাইলগুলিতেও উপলভ্য WinDef.h । আমি এখানে কয়েকটি প্রাসঙ্গিক প্রকারের তালিকাবদ্ধ করেছি:

প্রকার | এস / ইউ | x86 | x64
---------------------------- + + ----- + + -------- + + ------ -
BYTE, বুলিয়ান | ইউ | 8 বিট | 8 বিট
---------------------------- + + ----- + + -------- + + ------ -
ছোট | এস | 16 বিট | 16 বিট
ইউএসএইচআর্ট, ওয়ার্ড | ইউ | 16 বিট | 16 বিট
---------------------------- + + ----- + + -------- + + ------ -
আইএনটি, লং | এস | 32 বিট | 32 বিট
ইউআইএনটি, উলং, দ্বার | ইউ | 32 বিট | 32 বিট
---------------------------- + + ----- + + -------- + + ------ -
INT_PTR, লং_পটিআর, এলপাড়াম | এস | 32 বিট | 64 বিট
UINT_PTR, উলং_পটিআর, ডাব্লুপিআরএএম | ইউ | 32 বিট | 64 বিট
---------------------------- + + ----- + + -------- + + ------ -
দীর্ঘ | এস | 64 বিট | 64 বিট
লংলং, কিউবোর্ড | ইউ | 64 বিট | 64 বিট

"এস / ইউ" কলামটি স্বাক্ষরিত / স্বাক্ষরবিহীন ইঙ্গিত করে।


4

এমএসডিএন-এর এই নিবন্ধটি বিভিন্ন ধরণের এলিয়াস (উইন্ডোজে উপলব্ধ) উল্লেখ করেছে যা তাদের প্রস্থের ক্ষেত্রে কিছুটা স্পষ্ট:

http://msdn.microsoft.com/en-us/library/aa505945.aspx

উদাহরণস্বরূপ, আপনি যদি 64-বিট স্বাক্ষরযুক্ত ইন্টিগ্রাল মানটি উল্লেখ করতে ULONGLONG ব্যবহার করতে পারেন তবে আপনি UINT64 ব্যবহার করতে পারেন। (একইটি ইউলং এবং ইউআইএনটি 32 এর ক্ষেত্রেও রয়েছে)) সম্ভবত এগুলি কিছুটা পরিষ্কার হবে?


1
Uint32_t এবং DWORD বিনিময়যোগ্য হবে এমন কোন গ্যারান্টি আছে? এগুলি কল্পনা করা শক্ত নয় যে তারা নাও হতে পারে [উদাহরণস্বরূপ, যদি প্রাক্তনটি 32-বিট হয় intএবং পরবর্তীটি 32-বিট হয় long, জিসিসি এক ধরণের পয়েন্টার ধরে নিবে যে তারা তাদের মিলন উপস্থাপনা সত্ত্বেও অন্যটির নাম রাখতে সক্ষম হবে না]।
সুপারক্যাট

4

মাইক্রোসফ্ট পয়েন্টার হিসাবে একই আকারের পূর্ণসংখ্যার জন্য UINT_PTR এবং INT_PTR সংজ্ঞায়িত করেছে।

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


2

আপনার সংকলক / প্ল্যাটফর্মের জন্য এটি জানার সহজতম উপায়:

#include <iostream>

int main() {
  std::cout << sizeof(long)*8 << std::endl;
}

8 দ্বারা থিমটিপ্লিটেশন হ'ল বাইট থেকে বিট প্রাপ্ত।

আপনার যখন কোনও নির্দিষ্ট আকারের প্রয়োজন হয়, তখন প্রায়শই একটি লাইব্রেরির পূর্বনির্ধারিত ধরণের একটি ব্যবহার করা সহজ। যদি এটি অনাকাঙ্ক্ষিত হয় তবে আপনি অটোকনফ সফ্টওয়্যার দিয়ে প্রায়শই যা করতে পারেন তা করতে পারেন এবং কনফিগারেশন সিস্টেমটি প্রয়োজনীয় আকারের জন্য সঠিক প্রকারটি নির্ধারণ করতে পারেন।


4
এটি গুরুত্বপূর্ণ নয়, তবে 8-বিট বাইটগুলি আসলে সি স্পেকের অংশ নয় (ক্লাস 3.6 এবং সি স্ট্যান্ডার্ডের 5.2.4.2.1)। যদিও আপনি এমন 8 টি বিট নয় এমন কোনও মেশিন খুঁজে পেতে কঠোর চাপ দিয়েছিলেন, তবে আপনার লম্বা ডেটাটাইপটি কত বড় তা দেখতে আপনি LONG_BIT পরীক্ষা করতে পারেন।
আন্দ্রেস

অবশ্যই, আপনি ঠিক বলেছেন, এটি আসলে আর্কিটেকচার নির্ভর ("সঞ্চয়ের পরিবেশের মৌলিক চরিত্রের যে কোনও সদস্যকে ধারণ করার জন্য যথেষ্ট পরিমাণে ডেটা স্টোরেজের ঠিকানাযোগ্য ইউনিট") তবে 8 বিটের সমান সর্বাধিক ব্যবহৃত আর্কিটেকচার।
পল ডি ভ্রিজে

তবে ওপি তার সংকলক / প্ল্যাটফর্ম সম্পর্কে জিজ্ঞাসা করলো না ; তিনি বিশেষভাবে সম্পর্কে 64-বিট উইন্ডোজ জিজ্ঞাসা - সম্ভবতঃ কারণ তিনি না উপর পরীক্ষা করার জন্য একটি 64-বিট Windows সিস্টেম সুবিধাজনক এক্সেস আছে।
কুইকসপ্লসোন

0

longউইন্ডোজ প্ল্যাটফর্মে বিটের আকার 32 বিট (4 বাইট)।

আপনি এটি ব্যবহার করে পরীক্ষা করতে পারেন sizeof(long)


-2

আপনার যদি নির্দিষ্ট দৈর্ঘ্যের পূর্ণসংখ্যার ব্যবহার প্রয়োজন হয় তবে আপনাকে সম্ভবত কিছু প্ল্যাটফর্ম স্বতন্ত্র শিরোনাম ব্যবহার করা উচিত। বুস্ট দেখার জন্য ভাল জায়গা।

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