рд╕реАрдкреАрдереЙрди рдореЗрдВ рдЗрдВрдЯреЗрдЧрд░ рдЯрд╛рдЗрдк рдЗрдВрдкреНрд▓реАрдореЗрдВрдЯреЗрд╢рди

рд╕реАрдкреАрдереЙрди рдХреЗ рд╕реНрдореГрддрд┐ рдкреНрд░рдмрдВрдзрдХ , рдкрдВрдбреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИрдмрд░ рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓реЗрдЦ рдереЗ, рдореИрдВрдиреЗ рд╢рдмреНрджрдХреЛрд╢ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦрд╛ рдерд╛ред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рдирд┐рдпрдорд┐рдд рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ? рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИ рдФрд░ рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░ рдЗрддрдирд╛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред

рдЕрдЧрд░ рдЖрдк рд╕реЛрдЪ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ x * 2 x << 1 рд╕реЗ рдЕрдзрд┐рдХ рддреЗрдЬ рдХреНрдпреЛрдВ рд╣реИ ред

рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЯреНрд░рд┐рдХ рдХреЛ рдХреНрд░реИрдВрдХ рдХреИрд╕реЗ рдХрд░реЗрдВ:

>>> 42 == 4 True >>> 42 4 >>> 1 + 41 4 

рдлрд┐рд░ рдЖрдкрдХреЛ рдпрд╣ рд▓реЗрдЦ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЕрдЬрдЧрд░ рдореЗрдВ рдХреЛрдИ рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИрдВ - рд╕рднреА рдЪрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВ рдФрд░ рдбрд╛рдпрдиреЗрдорд┐рдХ рдореЗрдореЛрд░реА рдореЗрдВ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВред рдЙрд╕реА рд╕рдордп, рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рдХрд╛рд░ (рд╣рдо рджрд╢рдорд▓рд╡ рдирд╣реАрдВ рдорд╛рдирддреЗ рд╣реИрдВ) рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ - PyLongObjectред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рдШреЛрд╖рдгрд╛рдПрдБ рдЬрд┐рдирдореЗрдВ рдлрд╛рдЗрд▓реЗрдВ longobject.h, longintrepr.h рдФрд░ longobject.c рд╣реИрдВред

 struct _longobject { PyObject_VAR_HEAD //       digit ob_digit[1]; //   }; 

CPython рдореЗрдВ рдХрд┐рд╕реА рднреА рд╡рд╕реНрддреБ рдореЗрдВ рджреЛ рдлрд╝реАрд▓реНрдб рд╣реИрдВ: ob_refcnt - рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рдВрджрд░реНрдн рдХрд╛ рдХрд╛рдЙрдВрдЯрд░ рдФрд░ ob_type - рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░; рдСрдмреНрдЬреЗрдХреНрдЯ рдЬреЛ рдЙрдирдХреА рд▓рдВрдмрд╛рдИ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, ob_size рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ - рд╡рд░реНрддрдорд╛рди рдЖрд╡рдВрдЯрд┐рдд рдЖрдХрд╛рд░ (рдХрдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)ред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрдВрдХреЛрдВ рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд▓рдВрдмрд╛рдИ рдХреЗ рдПрдХ рд╕рд░рдгреА рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдЕрдЬрдЧрд░ рд▓рдВрдмреЗ рдЕрдВрдХрдЧрдгрд┐рдд рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рднрд╛рд╖рд╛ рдХреЗ рджреВрд╕рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХрд╛ "рд╕рд╛рдзрд╛рд░рдг" рдкреВрд░реНрдгрд╛рдВрдХ рдерд╛ред "рд▓рдВрдмреЗ" рдкреВрд░реНрдгрд╛рдВрдХ рдкрддреНрд░ рдПрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдП рдЧрдП рдереЗ, рдпрд╛ рдпрджрд┐ рдСрдкрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдкрд░рд┐рдгрд╛рдоред рд╕рд╛рдорд╛рдиреНрдп рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдХреЗ рдХрд╛рд░рдг, рддреАрд╕рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЗрд╕реЗ рдордирд╛ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ред

  # python2 num1 = 42 print num1, type(num1) # 42 <type 'int'> num2 = 42L print num2, type(num2) # 42 <type 'long'> num3 = 2 ** 100 print num3, type(num3) # 1267650600228229401496703205376 <type 'long'> 

_Longobject рд╕рдВрд░рдЪрдирд╛ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдкреВрд░реНрдгрд╛рдВрдХ рдорд╛рди рдЗрд╕рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ:

 sumi=0abs(ob size)тИТ1ob digitiтИЧ2SHIFTтИЧi


рдПрдХ рдмрд┐рдЯ рдХреЗ рд░реВрдк рдореЗрдВ, 64-рдмрд┐рдЯ рд╕рд┐рд╕реНрдЯрдо рдкрд░ 32-рдмрд┐рдЯ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдкреНрд░рдХрд╛рд░ (uint32_t) рдФрд░ 32-рдмрд┐рдЯ рдкрд░ 16-рдмрд┐рдЯ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд▓рдШреБ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдкрд┐рдЫрд▓реЗ рдлреЙрд░реНрдореВрд▓реЗ рд╕реЗ SHIFT рдкрд░ рд╕рдЦреНрдд рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рддреЗ рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЗрд╕реЗ 15 рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдЕрдм cpython 64 рдФрд░ 32-рдмрд┐рдЯ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдХреНрд░рдорд╢рдГ рджреЛ рдореВрд▓реНрдпреЛрдВ: 30 рдФрд░ 15 рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдирдХрд╛рд░рд╛рддреНрдордХ рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП, ob_size рдХрд╛ рдЛрдгрд╛рддреНрдордХ рдорд╛рди рд╣реИ, рд╢реВрдиреНрдп рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП ob_size = 0 рд╣реЛрддрд╛ рд╣реИред

рдЕрдВрдХрдЧрдгрд┐рддреАрдп рд╕рдВрдЪрд╛рд▓рди рдХрд░рддреЗ рд╕рдордп, рджреБрднрд╛рд╖рд┐рдпрд╛ рдСрдкрд░реЗрдВрдб рдХреА рд╡рд░реНрддрдорд╛рди рд▓рдВрдмрд╛рдИ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ, рдпрджрд┐ рджреЛрдиреЛрдВ рдореЗрдВ рдПрдХ рдмрд┐рдЯ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдорд╛рдирдХ рдЕрдВрдХрдЧрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

 static PyObject * long_add(PyLongObject *a, PyLongObject *b) { ... //   -     if (Py_ABS(Py_SIZE(a)) <= 1 && Py_ABS(Py_SIZE(b)) <= 1) { //      return PyLong_FromLong(MEDIUM_VALUE(a) + MEDIUM_VALUE(b)); } ... }; 

рдЧреБрдгрди рдореЗрдВ рдПрдХ рд╕рдорд╛рди рд╕рдВрд░рдЪрдирд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рджреБрднрд╛рд╖рд┐рдпрд╛ рдХрд░рддрд╕реБрдмрд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдФрд░ рддреНрд╡рд░рд┐рдд рд╕реНрдХреНрд╡реЗрд░рд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ , рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЙрдиреНрд╣реЗрдВ рд╣рд░ "рд▓рдВрдмреА рдЧреБрдгрд╛" рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдкрд░реНрдпрд╛рдкреНрдд рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП, рдЕрдВрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЬрд┐рд╕рдореЗрдВ рджреЛ рд╕реНрдерд┐рд░рд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рджрд┐рдП рдЧрдП рд╣реИрдВ:

 //     #define KARATSUBA_CUTOFF 70 //      #define KARATSUBA_SQUARE_CUTOFF (2 * KARATSUBA_CUTOFF) 

 static PyObject * long_mul(PyLongObject *a, PyLongObject *b) { ... //   -     if (Py_ABS(Py_SIZE(a)) <= 1 && Py_ABS(Py_SIZE(b)) <= 1) { // stwodigits -  ,    // int64_t  64-   long  32-. stwodigits v = (stwodigits)(MEDIUM_VALUE(a)) * MEDIUM_VALUE(b); return PyLong_FromLongLong((long long)v); } ... // ""    O(N^2),     . i = a == b ? KARATSUBA_SQUARE_CUTOFF : KARATSUBA_CUTOFF; if (asize <= i) { if (asize == 0) return (PyLongObject *)PyLong_FromLong(0); else return x_mul(a, b); } ... }; 

рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╢рд┐рдлреНрдЯ рдХрдорд╛рдВрдб рдореЗрдВ "рд╢реЙрд░реНрдЯ" рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рдорд╛рдорд▓реЗ рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ; рдЙрдиреНрд╣реЗрдВ рд╣рдореЗрд╢рд╛ рд▓рдВрдмреА рдЕрдВрдХрдЧрдгрд┐рдд рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╢рд┐рдлреНрдЯ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 2 рд╕реЗ рдЧреБрдгрд╛ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рддреЗрдЬрд╝ рд╣реИред рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рд╡рд┐рднрд╛рдЬрди рд╕рд╣реА рдмрджрд▓рд╛рд╡ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдзреАрдорд╛ рд╣реИ, рдЬреЛ рдПрдХрд▓-рдЕрдВрдХ рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рдорд╛рдорд▓реЗ рдХреА рднреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╡рд┐рднрд╛рдЬрди рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ: рдПрдХ рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рднрд╛рдЧрдлрд▓ рдХреА рдЧрдгрдирд╛ рдХрд░рддреА рд╣реИ, рдлрд┐рд░ рд╢реЗрд╖, NULL рдХреЛ рдЗрд╕реЗ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрджрд┐ рдЖрдкрдХреЛ рдПрдХ рдЪреАрдЬ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рд╡рд┐рдзрд┐ рдХреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреА рднреА рдЬрд╛рдВрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рдпрд╣ рд╕рдм рдУрд╡рд░рд╣реЗрдб рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИред

рддреБрд▓рдирд╛ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ "рд╢реЙрд░реНрдЯ" рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИред

 static int long_compare(PyLongObject *a, PyLongObject *b) { Py_ssize_t sign; // ,        //        if (Py_SIZE(a) != Py_SIZE(b)) { sign = Py_SIZE(a) - Py_SIZE(b); } else { Py_ssize_t i = Py_ABS(Py_SIZE(a)); //  ""        while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i]) ; if (i < 0) sign = 0; else { sign = (sdigit)a->ob_digit[i] - (sdigit)b->ob_digit[i]; if (Py_SIZE(a) < 0) sign = -sign; } } return sign < 0 ? -1 : sign > 0 ? 1 : 0; } 

рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рд╕рд╛рд░рдгреА (рд╕реВрдЪреА)


рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░ рдЪрд░ рдмрдирд╛рддреЗ рд╕рдордп, рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рдореЗрдореЛрд░реА рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рд╕реНрдерд╛рди рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдлрд┐рд░ рд╕рдВрджрд░реНрдн рдХрд╛рдЙрдВрдЯрд░ (рдЯрд╛рдЗрдк ssize_t), PyLongObject рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ, рдмрд┐рдЯ рд╕рд░рдгреА рдХрд╛ рд╡рд░реНрддрдорд╛рди рдЖрдХрд╛рд░ (рднреА ssize_t) рд╕реЗрдЯ рдХрд░реЗрдВ рдФрд░ рд╕рд░рдгреА рдХреЛ рд╕реНрд╡рдпрдВ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВред 64-рдмрд┐рдЯ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП, рдиреНрдпреВрдирддрдо рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЖрдХрд╛рд░ рд╣реИ: 2 * ssize_t + рд╕реВрдЪрдХ + рдЕрдВрдХ = 2 тАЛтАЛ* 8 + 8 + 4 = 28 рдмрд╛рдЗрдЯреНрд╕ред рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдмрдирд╛рддреЗ рд╕рдордп рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдорд╕реНрдпрд╛рдПрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИрдВ: рдЪреВрдВрдХрд┐ рд╕рдВрдЦреНрдпрд╛рдПрдВ рдПрдХ рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЕрдЬрдЧрд░ рд╕реНрдЯреЛрд░ рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рд╣реИрдВ, рдСрдмреНрдЬреЗрдХреНрдЯ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдЧрддрд┐рд╢реАрд▓ рдореЗрдореЛрд░реА рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВред

рдпрд╣ рд╡реНрдпрд╡рд╕реНрдерд╛ рд╕рд░рдгреА рдкрд░ рдЪрд▓рдирд╛ рдзреАрдорд╛ рдХрд░ рджреЗрддреА рд╣реИ: рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдкрд╣реБрдВрдЪ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╕рдВрдХреНрд░рдордг рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдбрд╛рдпрдиреЗрдорд┐рдХ рдореЗрдореЛрд░реА рдХреЗ рдЕрддреНрдпрдзрд┐рдХ рдЖрд╡рдВрдЯрди рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЬреЛ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рдордп рдХреЛ рдзреАрдорд╛ рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рдореЗрдореЛрд░реА рдлрд╝реНрд░реЗрдЧреНрдореЗрдВрдЯреЗрд╢рди рдореЗрдВ рдпреЛрдЧрджрд╛рди рджреЗрддрд╛ рд╣реИ, рдЕрдиреБрдХреВрд▓рди рдХреЛ cpython рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рд╕реНрдЯрд╛рд░реНрдЯ-рдЕрдк рдЪрд░рдг рдореЗрдВ, рдЫреЛрдЯреЗ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдкреВрд░реНрд╡-рдЖрд╡рдВрдЯрд┐рдд рдХреА рдЧрдИ рд╣реИ: -5 рд╕реЗ 256 рддрдХред

 #ifndef NSMALLPOSINTS #define NSMALLPOSINTS 257 //     python    . #endif #ifndef NSMALLNEGINTS #define NSMALLNEGINTS 5 #endif 

рдирддреАрдЬрддрди, cpython рдореЗрдВ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╕реНрдореГрддрд┐ рдореЗрдВ рджрд░реНрд╢рд╛рдИ рдЧрдИ рд╣реИ:



рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдЫреЛрдЯреЗ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреА рдкреВрд░реНрд╡-рдЪрдпрдирд┐рдд рд╕реВрдЪреА рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИ, рдЬреЛ рдЗрд╕ рд▓реЗрдЦ рд╕реЗ рд▓реИрд╕ рд╣реИ рдФрд░ рдорд╛рдирдХ ctypes рд╡рд┐рд╡рд░рдг:

рдЕрд╕реНрд╡реАрдХрд░рдг: рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреА рдЖрдкреВрд░реНрддрд┐ рдХреА рдЬрд╛рддреА рд╣реИ, рд▓реЗрдЦрдХ рдЗрд╕ рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдХреЛрдб рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрд╛рдж рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдФрд░ рд╕рд╛рде рд╣реА рдЖрдкрдХреЗ рдФрд░ рдЖрдкрдХреЗ рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ рдХреЗ рдорд╛рдирд╕рд┐рдХ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗ рд╕рдХрддрд╛ рд╣реИред

 import ctypes #  PyLongObject class IntStruct(ctypes.Structure): #   _fields_ = [("ob_refcnt", ctypes.c_long), ("ob_type", ctypes.c_void_p), ("ob_size", ctypes.c_long), ("ob_digit", ctypes.c_int)] def __repr__(self): return ("IntStruct(ob_digit={self.ob_digit}, ob_size={self.ob_size}, " "refcount={self.ob_refcnt})").format(self=self) if __name__ == '__main__': #    42 int42 = IntStruct.from_address(id(42)) print(int42) int_minus_2 = IntStruct.from_address(id(-2)) print(int_minus_2) # ob_digit=2, ob_size=-1 #       int42.ob_digit = 4 print(4 == 42) # True print(1 + 41) # 4 

рдИрдорд╛рдирджрд╛рд░ PyLongObject рдЗрд╕ рд╕реВрдЪреА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ, рдЕрд░реНрдерд╛рддреН, рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рд╕рдВрджрд░реНрдн рдХрд╛рдЙрдВрдЯрд░ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рджреБрднрд╛рд╖рд┐рдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рддрдиреЗ рд╢реВрдиреНрдп рд╣реИрдВред

рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреЗ рдЖрдВрддрд░рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдпрд╣ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ рдХрд┐ рдХреИрдереАрдереЙрди рдореЗрдВ рдЕрдВрдХрдЧрдгрд┐рдд рддреЗрдЬреА рд╕реЗ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдЕрдиреНрдп рднрд╛рд╖рд╛рдПрдВ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдкреБрдирд░рд╛рд╡реГрддреНрдд рд╣реЛрддреА рд╣реИрдВ, рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдореЗрдВ рдкрдврд╝рддреА рд╣реИрдВ рдФрд░ рд╕реАрдзреЗ рдХрдИ рдкреНрд░реЛрд╕реЗрд╕рд░ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдмреБрд▓рд╛рддреА рд╣реИрдВ, рд╕рд╛рдЗрдлрдереЙрди рдХреЛ рдкреВрд░реЗ рд╕реНрдореГрддрд┐ рдореЗрдВ рдЯреИрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЬрдЯрд┐рд▓ рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рджрд░реНрд╢рди рдХрд░рддреЗ рд╣реИрдВред рдПрдХрд▓-рдмрд┐рдЯ рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рд╕рд░рд▓рддрдо рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛, рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЛ рдЖрдХрд╛рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдлрд┐рд░ рдЧрддрд┐рд╢реАрд▓ рдореЗрдореЛрд░реА рдореЗрдВ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛, рд╕реЗрд╡рд╛ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рднрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ рд▓реМрдЯрдирд╛ рд╣реЛрдЧрд╛; рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреАрдЖрдИрдПрд▓ рд▓реЙрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдм рдЖрдк рд╕рдордЭ рдЧрдП рд╣реИрдВ рдХрд┐ рд╕реБрдиреНрди рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреНрдпреЛрдВ рдЖрдпрд╛ рдФрд░ рдпрд╣ рдЗрддрдирд╛ рд▓реЛрдХрдкреНрд░рд┐рдп рдХреНрдпреЛрдВ рд╣реИред

рдореИрдВ рдмреБрд▓рд┐рдпрди рдореЗрдВ рдкреВрд░реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЗрдЦ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдЕрдЪрд╛рдирдХ, рдмреВрд▓рд┐рдпрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рдеред

рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЬрдЧрд░ рдореЗрдВ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдмреВрд▓рд┐рдпрди рдЪрд░ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рдерд╛, рд╕рднреА рддрд╛рд░реНрдХрд┐рдХ рдлрд╝рдВрдХреНрд╢рди 0 рдФрд░ 1 рд▓реМрдЯреЗред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЙрдиреНрд╣реЛрдВрдиреЗ рдПрдХ рдирдП рдкреНрд░рдХрд╛рд░ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ ред рдЙрд╕реА рд╕рдордп, рдЗрд╕реЗ рдПрдХ рдмрд╛рд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкреВрд░реЗ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

 PyTypeObject PyBool_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) //       // ,       //     ob_size "bool", //   sizeof(struct _longobject), //    ... &PyLong_Type, //   ... bool_new, //  }; 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдмреВрд▓рд┐рдпрди рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рдорд╛рди рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рд╣реИ, рдмреВрд▓рд┐рдпрди рд╡реЗрд░рд┐рдПрдмрд▓ рдЯреНрд░реВ рдпрд╛ рдлрд╛рд▓реНрд╕ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реИ (рдХреЛрдИ рднреА рд╕рдорд╛рди рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред

 struct _longobject _Py_FalseStruct = { PyVarObject_HEAD_INIT(&PyBool_Type, 0) { 0 } }; struct _longobject _Py_TrueStruct = { PyVarObject_HEAD_INIT(&PyBool_Type, 1) { 1 } }; static PyObject * bool_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { PyObject *x = Py_False; long ok; if (!_PyArg_NoKeywords("bool", kwds)) return NULL; if (!PyArg_UnpackTuple(args, "bool", 0, 1, &x)) return NULL; ok = PyObject_IsTrue(x); if (ok < 0) return NULL; return PyBool_FromLong(ok); } PyObject *PyBool_FromLong(long ok) { PyObject *result; if (ok) result = Py_True; else result = Py_False; Py_INCREF(result); return result; } 

PyObject_IsTrue (x) рдПрдХ рдмреВрд▓рд┐рдпрди рдорд╛рди рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдореБрд╢реНрдХрд┐рд▓ рддрдВрддреНрд░ рд╣реИ, рдЖрдк рдЗрд╕реЗ рдпрд╣рд╛рдВ рдмреВрд▓ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдпрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕ рддрд░рд╣ рдХреА рд╡рд┐рд░рд╛рд╕рдд рдХреБрдЫ рдордЬрд╝реЗрджрд╛рд░ рдкреНрд░рднрд╛рд╡ рдбрд╛рд▓рддреА рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдЯреНрд░реВ рдФрд░ 1 рдХреА рд╕рдЯреАрдХ рд╕рдорд╛рдирддрд╛, рдЯреНрд░реВ рдФрд░ 1 рдХреА рдЪрд╛рдмрд┐рдпрд╛рдБ рдФрд░ рд╕реЗрдЯ рдореЗрдВ рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдХреНрд╖рдорддрд╛ рдФрд░ рдмреВрд▓рд┐рдпрди рдкреНрд░рдХрд╛рд░ рдкрд░ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рд╕рдВрдЪрд╛рд▓рди рдХреА рд╡реИрдзрддрд╛:

 >>> True == 1 True >>> {True: "true", 1: "one"} {True: 'one'} >>> True * 2 + False / (5 * True) - (True << 3) -6.0 >>> False < -1 False 

рдЕрдЬрдЧрд░ рдХреА рднрд╛рд╖рд╛ рдЙрд╕рдХреЗ рд▓рдЪреАрд▓реЗрдкрди рдФрд░ рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рд╢рд╛рдирджрд╛рд░ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рд╕рдм рдПрдХ рдХреАрдордд рдкрд░ рдЖрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрддрд┐рд░рдВрдЬрд┐рдд рд╕рд╛рд░ рдФрд░ рдУрд╡рд░рд╣реЗрдб рдХреЗ рд░реВрдк рдореЗрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдо рдЕрдХреНрд╕рд░ рд╕реЛрдЪрддреЗ рдпрд╛ рдЕрдиреБрдорд╛рди рдирд╣реАрдВ рд▓рдЧрд╛рддреЗ рд╣реИрдВред рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд▓реЗрдЦ рдиреЗ рдЖрдкрдХреЛ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдкрд░ "рдпреБрджреНрдз рдХреЗ рдХреЛрд╣рд░реЗ" рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рд╣реИ, рд╢рд╛рдпрдж рдЖрдк рдЗрд╕реЗ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рднреА рдХрд░реЗрдВред рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЛрдб рдХреЛ рдкрдврд╝рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ, рд▓рдЧрднрдЧ рдЕрдЬрдЧрд░ рдкрд░ рд╣реА рдХреЛрдб рдХреА рддрд░рд╣, рдФрд░ рдЗрд╕рдХрд╛ рдЕрдзреНрдпрдпрди рдЖрдкрдХреЛ рди рдХреЗрд╡рд▓ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдХрд┐ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рджрд┐рд▓рдЪрд╕реНрдк рдПрд▓реНрдЧреЛрд░рд┐рдердо рдФрд░ рд╕рд┐рд╕реНрдЯрдо рд╕рдорд╛рдзрд╛рди рднреА, рдФрд░ рд╕рд╛рде рд╣реА рд╕рдВрднрд╡рддрдГ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд▓реЗрдЦ рд▓рд┐рдЦрддреЗ рд╣реИрдВ) рдФрд░ рд╕реНрд╡рдпрдВ рд╕рд╛рдЗрдлрди рдХреЗ рдбреЗрд╡рд▓рдкрд░ рдмрди рдЬрд╛рддреЗ рд╣реИрдВред

Source: https://habr.com/ru/post/hi455114/


All Articles