2010-12-30 12 views
17

यह bignum पुस्तकालयों और सी भाषा के लिए जीसीसी विशिष्ट हैक्स के विषय पर आज पहले एक सवाल से पैदा हुई विशेष रूप से, इन दोनों घोषणाओं का इस्तेमाल किया गया:।जीसीसी __attribute __ ((मोड (XX)) वास्तव में क्या करता है

typedef unsigned int dword_t __attribute__((mode(DI))); 

32 बिट सिस्टम पर और

typedef unsigned int dword_t __attribute__((mode(TI))); 

64-बिट सिस्टम पर।

मैं दिया यह मानें कि इस सी भाषा के लिए एक विस्तार प्राप्त करने के लिए जो कुछ भी यह प्राप्त होता है कोई रास्ता मौजूद है है वर्तमान (सी 99) मानकों में।

तो मेरे सवालों का सरल हैं: कि इस धारणा सही है? और अंतर्निहित स्मृति के लिए ये कथन क्या करते हैं? मुझे लगता है कि परिणाम मैं 64-बिट सिस्टम के लिए एक dword में 32-बिट सिस्टम के लिए 2*sizeof(uint32_t) और 2*sizeof(uint64_t) है, मैं सही हूँ?

उत्तर

21

ये आपको 'लंबे' या 'int' के आकार जैसे कंपाइलर या मशीन सेमेन्टिक्स के आधार पर किसी प्रकार के आकार को स्पष्ट रूप से निर्दिष्ट करने की अनुमति देते हैं।

वे काफी अच्छी तरह से on this page वर्णित हैं।

मैं उस पृष्ठ से बोली:

QI: एक पूर्णांक के रूप में व्यापक है कि छोटी से छोटी पता इकाई, आम तौर पर 8 बिट्स के रूप में।

HI: एक पूर्णांक, के रूप में चौड़ा, एक क्यूआई मोड पूर्णांक, आमतौर पर 16 बिट्स।

एसआई: एक पूर्णांक, QI मोड पूर्णांक के रूप में चौड़े चौड़े, आमतौर पर 32 बिट्स।

DI: एक पूर्णांक, क्यूआई मोड पूर्णांक के रूप में चौड़े आठ गुना, आमतौर पर 64 बिट्स।

एस एफ: एक एसआई मोड पूर्णांक है, आमतौर पर 32 बिट के रूप में एक चल बिन्दु मूल्य, के रूप में व्यापक।

डीएफ: ए फ्लोटिंग पॉइंट मान, डीआई मोड पूर्णांक के रूप में चौड़ा, आमतौर पर 64 बिट्स।

तो DI अनिवार्य रूप से sizeof(char) * 8 है।

TI मोड सहित आगे स्पष्टीकरण here (संभवतः पहले लिंक से बेहतर है, लेकिन दोनों संदर्भ के लिए प्रदान किया जा सकता है) पाया जा सकता है।

तो TI अनिवार्य रूप से sizeof(char) * 16 (128 बिट्स) है।

+0

मैं बस क्या जरूरत है, +1। क्या इसके चारों ओर जाने के लिए कोई "मानक" तरीका नहीं है, मैं इसे लेता हूं? यानी 128-बिट प्रकार कहें? अपने वर्तमान उपयोग में, हम 'dword = word << 1' सुरक्षित और आसानी से कर सकते हैं; अगर मैं इसे मदद कर सकता हूं तो मैं इसे फ़ंक्शन इत्यादि से प्रतिस्थापित नहीं करूंगा। –

+0

@Ninefingers: जीसीसी में आप '__int128' का उपयोग कर सकते हैं मेरा मानना ​​है: http://gcc.gnu.org/onlinedocs/gcc/_005f_005fint128.html। –

+0

@Ninefingers: जीसीसी विस्तार प्रकार '__int128_t' और' __uint128_t' (कम से कम 64-बिट प्लेटफॉर्म पर, 32-बिट लक्ष्यों के बारे में सुनिश्चित नहीं है) –

2

@ हेलिक्स बस इस प्रश्न को पढ़ें और मैंने इस बात को समझने की भी कोशिश की। मेरे पढ़ने से: आप जीसीसी स्रोत पेड़ में [gcc/gcc/machmode.def] में परिभाषाएं पा सकते हैं।के लिए 'एसडी' यह होना चाहिए:

/* Decimal floating point modes. */ 
DECIMAL_FLOAT_MODE (SD, 4, decimal_single_format); 

और 'DECIMAL_FLOAT_MODE' का कहना है:

 DECIMAL_FLOAT_MODE (MODE, BYTESIZE, FORMAT); 
declares MODE to be of class DECIMAL_FLOAT and BYTESIZE bytes 
wide. All of the bits of its representation are significant. 
संबंधित मुद्दे