Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemath
GitHub Repository: sagemath/sagelib
Path: blob/master/c_lib/src/mpz_longlong.c
4024 views
1
/* long long -> mpz conversion
2
*
3
* Author: Robert Bradshaw <[email protected]>
4
* Date: November 2008
5
* License: GPL v2 or later
6
*
7
* this is free software: if it breaks, you get to keep all the pieces
8
*/
9
10
#include "mpz_longlong.h"
11
#include <assert.h>
12
13
void mpz_set_longlong(mpz_ptr z, long long val) {
14
if (sizeof(mp_limb_t) == sizeof(long long)) {
15
mpz_set_si(z, val);
16
}
17
else if (2*sizeof(mp_limb_t) == sizeof(long long)) {
18
mp_limb_t* limbs = (mp_limb_t*)&val;
19
int sign = (val > 0) - (val < 0);
20
val *= sign;
21
_mpz_realloc (z, 2);
22
const int endianness = 1;
23
if (((char*)&endianness)[0]) {
24
// little endian
25
z->_mp_d[0] = limbs[0];
26
z->_mp_d[1] = limbs[1];
27
}
28
else {
29
// big endian
30
z->_mp_d[0] = limbs[1];
31
z->_mp_d[1] = limbs[0];
32
}
33
z->_mp_size = sign * (2 - !z->_mp_d[1]);
34
}
35
else {
36
assert(sizeof(mp_limb_t) == sizeof(long long) || 2*sizeof(mp_limb_t) == sizeof(long long));
37
}
38
}
39
40
41
void mpz_set_ulonglong(mpz_ptr z, unsigned long long val) {
42
if (sizeof(mp_limb_t) == sizeof(unsigned long long)) {
43
mpz_set_ui(z, (mp_limb_t)val);
44
}
45
else if (2*sizeof(mp_limb_t) == sizeof(unsigned long long)) {
46
mp_limb_t* limbs = (mp_limb_t*)&val;
47
_mpz_realloc (z, 2);
48
const int endianness = 1;
49
if (((char*)&endianness)[0]) {
50
// little endian
51
z->_mp_d[0] = limbs[0];
52
z->_mp_d[1] = limbs[1];
53
}
54
else {
55
// big endian
56
z->_mp_d[0] = limbs[1];
57
z->_mp_d[1] = limbs[0];
58
}
59
z->_mp_size = (!!z->_mp_d[1] + (z->_mp_d[1] || z->_mp_d[0])); // 0, 1, or 2
60
}
61
else {
62
assert(sizeof(mp_limb_t) == sizeof(unsigned long long) || 2*sizeof(mp_limb_t) == sizeof(unsigned long long));
63
}
64
}
65
66