14 #include "cln/number.h"
17 #include "cln/integer_io.h"
18 #include "cln/abort.h"
22 sint64 cl_I_to_Q (const cl_I& obj)
26 return (sint64)(sintV)FN_to_V(obj);
28 var cl_heap_bignum* bn = TheBignum(obj);
29 var uintC len = bn->length;
30 if ((sintD)mspref(arrayMSDptr(bn->data,len),0) >= 0) {
32 #define IF_LENGTH(i) \
33 if (bn_minlength <= i) /* genau i Digits überhaupt möglich? */\
34 if (len == i) /* genau i Digits? */ \
35 /* 2^((i-1)*intDsize-1) <= obj < 2^(i*intDsize-1) */ \
36 if ( (i*intDsize > 64) \
37 && ( ((i-1)*intDsize >= 64) \
38 || (mspref(arrayMSDptr(bn->data,len),0) >= (uintD)bitc(63-(i-1)*intDsize)) \
44 return (uint64)arrayLSref(bn->data,1,0);
48 return (uint64)get_uint1D_Dptr(arrayLSDptr(bn->data,1));
50 return ((uint64)get_uint1D_Dptr(arrayLSDptr(bn->data,2) lspop 1) << 32) | (uint64)get_uint1D_Dptr(arrayLSDptr(bn->data,2));
54 return (uint64)get_uint1D_Dptr(arrayLSDptr(bn->data,1));
56 return (uint64)get_uint2D_Dptr(arrayLSDptr(bn->data,2));
58 return ((uint64)get_uint1D_Dptr(arrayLSDptr(bn->data,3) lspop 2) << 32) | (uint64)get_uint2D_Dptr(arrayLSDptr(bn->data,3));
60 return ((uint64)get_uint2D_Dptr(arrayLSDptr(bn->data,4) lspop 2) << 32) | (uint64)get_uint2D_Dptr(arrayLSDptr(bn->data,4));
64 return (uint64)get_uint1D_Dptr(arrayLSDptr(bn->data,1));
66 return (uint64)get_uint2D_Dptr(arrayLSDptr(bn->data,2));
68 return (uint64)get_uint3D_Dptr(arrayLSDptr(bn->data,3));
70 return (uint64)get_uint4D_Dptr(arrayLSDptr(bn->data,4));
72 return ((uint64)get_uint1D_Dptr(arrayLSDptr(bn->data,5) lspop 4) << 32) | (uint64)get_uint4D_Dptr(arrayLSDptr(bn->data,5));
74 return ((uint64)get_uint2D_Dptr(arrayLSDptr(bn->data,6) lspop 4) << 32) | (uint64)get_uint4D_Dptr(arrayLSDptr(bn->data,6));
76 return ((uint64)get_uint3D_Dptr(arrayLSDptr(bn->data,7) lspop 4) << 32) | (uint64)get_uint4D_Dptr(arrayLSDptr(bn->data,7));
78 return ((uint64)get_uint4D_Dptr(arrayLSDptr(bn->data,8) lspop 4) << 32) | (uint64)get_uint4D_Dptr(arrayLSDptr(bn->data,8));
83 #define IF_LENGTH(i) \
84 if (bn_minlength <= i) /* genau i Digits überhaupt möglich? */\
85 if (len == i) /* genau i Digits? */ \
86 /* - 2^(i*intDsize-1) <= obj < - 2^((i-1)*intDsize-1) */ \
87 if ( (i*intDsize > 64) \
88 && ( ((i-1)*intDsize >= 64) \
89 || (mspref(arrayMSDptr(bn->data,len),0) < (uintD)(-bitc(63-(i-1)*intDsize))) \
95 return (sint64)arrayLSref(bn->data,1,0);
99 return (sint64)get_sint1D_Dptr(arrayLSDptr(bn->data,1));
101 return ((sint64)get_sint1D_Dptr(arrayLSDptr(bn->data,2) lspop 1) << 32) | (uint64)get_uint1D_Dptr(arrayLSDptr(bn->data,2));
105 return (sint64)get_sint1D_Dptr(arrayLSDptr(bn->data,1));
107 return (sint64)get_sint2D_Dptr(arrayLSDptr(bn->data,2));
109 return ((sint64)get_sint1D_Dptr(arrayLSDptr(bn->data,3) lspop 2) << 32) | (uint64)get_uint2D_Dptr(arrayLSDptr(bn->data,3));
111 return ((sint64)get_sint2D_Dptr(arrayLSDptr(bn->data,4) lspop 2) << 32) | (uint64)get_uint2D_Dptr(arrayLSDptr(bn->data,4));
115 return (sint64)get_sint1D_Dptr(arrayLSDptr(bn->data,1));
117 return (sint64)get_sint2D_Dptr(arrayLSDptr(bn->data,2));
119 return (sint64)get_sint3D_Dptr(arrayLSDptr(bn->data,3));
121 return (sint64)get_sint4D_Dptr(arrayLSDptr(bn->data,4));
123 return ((sint64)get_sint1D_Dptr(arrayLSDptr(bn->data,5) lspop 4) << 32) | (uint64)get_uint4D_Dptr(arrayLSDptr(bn->data,5));
125 return ((sint64)get_sint2D_Dptr(arrayLSDptr(bn->data,6) lspop 4) << 32) | (uint64)get_uint4D_Dptr(arrayLSDptr(bn->data,6));
127 return ((sint64)get_sint3D_Dptr(arrayLSDptr(bn->data,7) lspop 4) << 32) | (uint64)get_uint4D_Dptr(arrayLSDptr(bn->data,7));
129 return ((sint64)get_sint4D_Dptr(arrayLSDptr(bn->data,8) lspop 4) << 32) | (uint64)get_uint4D_Dptr(arrayLSDptr(bn->data,8));
133 bad: // unpassendes Objekt
134 fprint(std::cerr, "Not a 64-bit integer: ");
135 fprint(std::cerr, obj);
136 fprint(std::cerr, "\n");