PHP सी द्वारा लिखा गया है, जब मैंने स्रोत कोड पढ़ा, तो मुझे एक अजनबी मैक्रो विस्तार मिला, जो नीचे की तरह है।

(size_t)(uint32_t)-(int32_t)(nTableMask) // nTableMask=-8

मैं (size_t)(uint32_t) प्रिंट करने के लिए gdb का उपयोग करता हूं, यह गलत है

(gdb) p (size_t)(uint32_t) A syntax error in expression, near `'.

लेकिन जब मैं अभिव्यक्ति बदलता हूं, यह काम करता है

(gdb) p (size_t)(uint32_t)-(int32_t)(-8) $21 = 8

मेरी समस्या:

(size_t)(uint32_t)-(int32_t)(-8) का क्या अर्थ है? मुझे पता है (size_t)(uint32_t) गलत है, लेकिन (size_t)(uint32_t)-(int32_t)(-8) एक सही अभिव्यक्ति क्यों है?

1
Mattia Dinosaur 1 मई 2018, 17:46

2 जवाब

सबसे बढ़िया उत्तर
(size_t)(uint32_t)-(int32_t)(-8)

पहले (int32_t)(-8) या 0xFFFFFFF8 है

तो यह (uint32_t)- -8 या (uint32_t)8 या 0x00000008 है

अंत में यह (size_t) 8 है क्योंकि size_t का आकार uint32_t से भिन्न हो सकता है

यह 64 बिट सिस्टम पर 0x0000000000000008 होगा।

2
cleblanc 1 मई 2018, 18:25

कोड: (size_t)(uint32_t)-(int32_t)(nTableMask) का मतलब है:

1. -(int32_t)(nTableMask) //Cast nTableMask to signed int32 and invert sign
2. (uint32_t) //cast value on step 1 to unsigned int32
3. (size_t) //cast value on step 2 to unsigned int64

यह कोड arData (ऊपरी भाग) के हैशटेबल भाग के आकार की गणना करने के लिए उपयोग कर रहा है।

/*

 * HashTable Data Layout
 * =====================
 *
 *                 +=============================+
 *                 | HT_HASH(ht, ht->nTableMask) |
 *                 | ...                         |
 *                 | HT_HASH(ht, -1)             |
 *                 +-----------------------------+
 * ht->arData ---> | Bucket[0]                   |
 *                 | ...                         |
 *                 | Bucket[ht->nTableSize-1]    |
 *                 +=============================+
 */
1
legale 30 पद 2018, 13:26