2008-12-21 6 views
113

बहुत पहले नहीं, किसी ने मुझे बताया कि long 64 बिट मशीनों पर 64 बिट्स नहीं हैं और मुझे हमेशा int का उपयोग करना चाहिए। यह मुझे समझ में नहीं आया। मैंने दस्तावेज़ों को देखा है (जैसे ऐप्पल की आधिकारिक साइट पर एक) का कहना है कि 64-बिट CPU के लिए संकलित करते समय long वास्तव में 64 बिट्स हैं। मैं ऊपर देखा क्या इस पर 64-बिट Windows था और64-बिट विंडोज़ पर लंबे समय तक थोड़ा सा आकार क्या है?

  • पाया विंडोज: long और int लंबाई में 32-बिट बने हुए हैं, और विशेष नए डेटा प्रकार 64-बिट पूर्णांकों के लिए परिभाषित कर रहे हैं।
( http://www.intel.com/cd/ids/developer/asmo-na/eng/197664.htm?page=2 से)

मैं क्या इस्तेमाल करना चाहिए? क्या मुझे uw, sw ((un) हस्ताक्षरित चौड़ाई) के रूप में कुछ परिभाषित करना चाहिए यदि long के रूप में Windows पर नहीं है, और अन्यथा लक्ष्य CPU बिटसाइट पर कोई जांच करें?

+0

एमएसवीसी ++ int और लंबे समय तक विंडोज़ पर 32-बिट हैं: https://msdn.microsoft.com/en-us/library/3b2e7499.aspx। हालांकि, उदाहरण के लिए अनुमति 4 जी से अधिक वस्तुओं को स्टोर करने के लिए वैक्टर, size_t 64 बिट है। इसलिए किसी को int को फिर से करने के बजाय int64_t का उपयोग करने की आवश्यकता है उदा। वेक्टर जिनमें 4 जी से अधिक आइटम हो सकते हैं। –

+0

** सिगविन ** ['आकार (लम्बा) == 8', यहां तक ​​कि विंडोज़ पर] (http://stackoverflow.com/a/39207744/485343) :-) – rustyx

+0

@ सर्जरोगैच उन्हें 'size_t' या' 'it' या' int64_t' –

उत्तर

0

यदि आपको कुछ लंबाई के पूर्णांक का उपयोग करने की आवश्यकता है, तो आपको शायद आपकी सहायता के लिए कुछ प्लेटफार्म स्वतंत्र शीर्षकों का उपयोग करना चाहिए। बूस्ट देखने के लिए एक अच्छी जगह है।

4

MSDN पर इस लेख प्रकार उपनाम के एक नंबर (विंडोज पर उपलब्ध है) कि थोड़ा और उनकी चौड़ाई के संबंध में स्पष्ट कर रहे हैं का संदर्भ:

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

उदाहरण के लिए, यद्यपि आप संदर्भ के लिए ULONGLONG उपयोग कर सकते हैं एक 64-बिट हस्ताक्षरित अभिन्न मूल्य, आप UINT64 का भी उपयोग कर सकते हैं। (यह यूएलओएन और यूआईएनटी 32 के लिए भी जाता है।) शायद ये थोड़ा स्पष्ट होगा?

+1

क्या कोई गारंटी है कि uint32_t और DWORD एक दूसरे के बदले में होगा? कल्पना करना मुश्किल नहीं है कि वे नहीं हो सकते हैं [उदा। यदि पूर्व 32-बिट 'int' है और बाद वाला 32-बिट 'लंबा' है, तो जीसीसी मान लेगा कि एक प्रकार के पॉइंटर को उनके मिलान के प्रतिनिधित्व के बावजूद दूसरे को उपनाम करने में असमर्थ होगा]। – supercat

2

सबसे आसान तरीका है अपने संकलक/प्लेटफ़ॉर्म की यह जानने के लिए:

#include <iostream> 

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

8 से Themultiplication बाइट्स से बिट्स प्राप्त करने के लिए है।

जब आपको किसी विशेष आकार की आवश्यकता होती है, तो लाइब्रेरी के पूर्वनिर्धारित प्रकारों में से किसी एक का उपयोग करना अक्सर आसान होता है। यदि यह अवांछनीय है, तो आप अक्सर ऑटोकॉन्फ़ सॉफ़्टवेयर के साथ क्या कर सकते हैं और कॉन्फ़िगरेशन सिस्टम आवश्यक आकार के लिए सही प्रकार निर्धारित करता है।

+4

यह महत्वपूर्ण नहीं है, लेकिन 8-बिट बाइट वास्तव में सी स्पेक (सी मानक के खंड 3.6 और 5.2.4.2.1) का हिस्सा नहीं हैं। यद्यपि आपको ऐसी मशीन खोजने के लिए कठोर दबाव डाला जाएगा जहां यह 8 बिट्स नहीं था, आप यह देखने के लिए LONG_BIT देख सकते हैं कि आपका लंबा डेटाटाइप कितना बड़ा है। – Andres

+0

बेशक, आप सही हैं, यह वास्तव में आर्किटेक्चर निर्भर है ("निष्पादन पर्यावरण के मूल चरित्र सेट के किसी भी सदस्य को पकड़ने के लिए पर्याप्त डेटा स्टोरेज की एड्रेस करने योग्य इकाई"), लेकिन सबसे अधिक उपयोग किए जाने वाले आर्किटेक्चर जो 8 बिट्स के बराबर होते हैं। –

+0

लेकिन ओपी ने * उसके * कंपाइलर/मंच के बारे में नहीं पूछा; उन्होंने विशेष रूप से 64-बिट विंडोज़ के बारे में पूछा - संभवत: क्योंकि उनके पास परीक्षण करने के लिए 64-बिट विंडोज सिस्टम तक सुविधाजनक पहुंच नहीं है। – Quuxplusone

3

माइक्रोसॉफ्ट ने पूर्णांक के लिए UINT_PTR और INT_PTR भी परिभाषित किया है जो सूचक के समान आकार के हैं।

यहां एक list of Microsoft specific types है - यह उनके ड्राइवर संदर्भ का हिस्सा है, लेकिन मेरा मानना ​​है कि यह सामान्य प्रोग्रामिंग के लिए भी मान्य है।

222

यूनिक्स दुनिया में, 64-बिट प्लेटफ़ॉर्म के लिए पूर्णांक और पॉइंटर्स के आकार के लिए कुछ संभावित व्यवस्थाएं थीं। दोनों व्यापक रूप से उपयोग किए जाने वाले आईएलपी 64 थे (असल में, इसका केवल कुछ ही उदाहरण थे; क्रे एक ऐसा था) और एलपी 64 (लगभग बाकी सब कुछ के लिए)। Acronynms 'int, long, पॉइंटर्स 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 

ILP64 प्रणाली LP64 के पक्ष (में छोड़ दिया गया था वह यह है कि लगभग सभी बाद में इस्तेमाल किया LP64 नवागंतुकों, एस्पेन समूह की सिफारिशों के आधार, केवल 64-बिट आपरेशन की एक लंबी विरासत के साथ एक अलग सिस्टम का उपयोग योजना)। सभी आधुनिक 64-बिट यूनिक्स सिस्टम एलपी 64 का उपयोग करते हैं। मैकोज़ एक्स और लिनक्स दोनों आधुनिक 64-बिट सिस्टम हैं।

माइक्रोसॉफ्ट 64-बिट में संक्रमण के लिए एक अलग योजना का उपयोग करता है: एलएलपी 64 ('लंबा लंबा, पॉइंटर्स 64-बिट')। इसका अर्थ यह है कि 32-बिट सॉफ़्टवेयर को बिना किसी परिवर्तन के बदला जा सकता है। यह हर किसी के काम से भिन्न होने का विचलन है, और 64-बिट क्षमताओं का फायदा उठाने के लिए कोड को संशोधित करने की भी आवश्यकता है। हमेशा संशोधन आवश्यक था; यह यूनिक्स प्लेटफॉर्म पर आवश्यक लोगों से संशोधन का एक अलग सेट था।

यदि आप अपने सॉफ़्टवेयर को प्लेटफ़ॉर्म-तटस्थ पूर्णांक प्रकार के नामों के आसपास डिज़ाइन करते हैं, तो शायद C99 <inttypes.h> शीर्षलेख का उपयोग करके, जो प्लेटफॉर्म पर उपलब्ध होते हैं, हस्ताक्षर किए गए (सूचीबद्ध) और हस्ताक्षरित (सूचीबद्ध नहीं) में प्रदान करता है, इसके साथ उपसर्ग 'यू'):

  • int8_t - 8 बिट पूर्णांकों
  • int16_t - 16-बिट पूर्णांक
  • int32_t - 32-बिट पूर्णांक
  • int64_t - 64-बिट में tegers
  • uintptr_t - अहस्ताक्षरित पूर्णांकों काफी बड़ा संकेत
  • intmax_t धारण करने के लिए - मंच पर पूर्णांक के सबसे बड़े आकार (से बड़ा int64_t हो सकता है)

फिर आप जहां यह मायने रखता है इन प्रकार का उपयोग कर अपने आवेदन कोड कर सकते हैं , और सिस्टम प्रकारों से बहुत सावधान रहना (जो अलग हो सकता है)। intptr_t प्रकार है - पॉइंटर्स रखने के लिए एक हस्ताक्षरित पूर्णांक प्रकार; आपको इसका उपयोग न करने की योजना बनाना चाहिए, या केवल दो uintptr_t मानों (ptrdiff_t) के घटाव के परिणामस्वरूप इसका उपयोग करना चाहिए।

लेकिन, जैसा कि प्रश्न बताता है (अविश्वास में), 64-बिट मशीनों पर पूर्णांक डेटा प्रकारों के आकार के लिए अलग-अलग सिस्टम हैं। इस्की आद्त डाल लो; दुनिया बदलने वाला नहीं है।

+8

उपयोग के उन लोगों के लिए जो काफी लंबे समय से रहे हैं, 64-बिट संक्रमण के मध्य -80 के दशक के 16-बिट से 32-बिट संक्रमण के साथ कुछ समानताएं हैं। ऐसे कंप्यूटर थे जो आईएल 32 और अन्य थे जो एल 32 थे (पुरानी समस्या के लिए नए नोटेशन को अनुकूलित करना)। कभी-कभी 'int' 16-बिट था, कभी-कभी 32-बिट। –

+2

यह न भूलें कि यह केवल सी-ईश भाषाओं पर लागू होता है। दूसरों के पास सैनर विनिर्देश हैं जहां ए) कंपाइलर लेखक को डेटाटाइप के आकार का चयन करने की अनुमति नहीं है या बी) डेटाटाइप का भौतिक प्रतिनिधित्व "रिसाव" नहीं होता है या सी) पूर्णांक हमेशा असीम रूप से बड़े होते हैं। –

+0

सच है - लेकिन उन भाषाओं के लिए जो व्यवहार निर्दिष्ट करते हैं, पहले स्थान पर कोई समस्या नहीं है। उदाहरण के लिए, जावा में 'लंबा' है, लेकिन आकार सभी प्लेटफॉर्म पर तय किया गया है (64-बिट?)। तो, 64-बिट मशीन को पोर्ट करने में कोई समस्या नहीं है; आकार बदलता नहीं है। –

38

यह स्पष्ट नहीं है कि प्रश्न Microsoft C++ संकलक या Windows API के बारे में है या नहीं। हालांकि, कोई [सी ++] टैग नहीं है इसलिए मुझे लगता है कि यह विंडोज एपीआई के बारे में है। कुछ जवाब लिंक सड़कों से पीड़ित हैं इसलिए मैं एक और लिंक प्रदान कर रहा हूं जो सड़ांध कर सकता है।


INT तरह Windows API प्रकार, LONG आदि के बारे में जानकारी के लिए वहाँ MSDN पर एक पृष्ठ है:

Windows Data Types

जानकारी भी WinDef.h जैसे विभिन्न विंडोज हेडर फाइल में उपलब्ध है। मैंने यहां कुछ प्रासंगिक प्रकार सूचीबद्ध किए हैं:

 
Type      | S/U | x86 | x64 
----------------------------+-----+--------+------- 
BYTE, BOOLEAN    | U | 8 bit | 8 bit 
----------------------------+-----+--------+------- 
SHORT      | S | 16 bit | 16 bit 
USHORT, WORD    | U | 16 bit | 16 bit 
----------------------------+-----+--------+------- 
INT, LONG     | S | 32 bit | 32 bit 
UINT, ULONG, DWORD   | U | 32 bit | 32 bit 
----------------------------+-----+--------+------- 
INT_PTR, LONG_PTR, LPARAM | S | 32 bit | 64 bit 
UINT_PTR, ULONG_PTR, WPARAM | U | 32 bit | 64 bit 
----------------------------+-----+--------+------- 
LONGLONG     | S | 64 bit | 64 bit 
ULONGLONG, QWORD   | U | 64 bit | 64 bit 

कॉलम "एस/यू" हस्ताक्षरित/हस्ताक्षरित दर्शाता है।

+3

साढ़े तीन साल बाद, और आपका लिंक अभी भी अच्छा है – makoshichi

संबंधित मुद्दे