Skip to content

Commit 6b51b99

Browse files
authored
Fix unary minus on unsigned type warning (#525)
* Fix "unary minus operator applied to unsigned type" warning * Fix "implicit conversion changes signedness" warning in recently added code
1 parent 50b80b1 commit 6b51b99

File tree

2 files changed

+17
-17
lines changed

2 files changed

+17
-17
lines changed

ext/bigdecimal/div.h

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,14 @@ divmod_by_inv_mul(VALUE x, VALUE y, VALUE inv, VALUE *res_div, VALUE *res_mod) {
5959

6060
static void
6161
slice_copy(DECDIG *dest, Real *src, size_t rshift, size_t length) {
62-
ssize_t start = src->exponent - rshift - length;
62+
ssize_t start = src->exponent - (ssize_t)rshift - (ssize_t)length;
6363
if (start >= (ssize_t)src->Prec) return;
6464
if (start < 0) {
6565
dest -= start;
66-
length += start;
66+
length -= (size_t)(-start);
6767
start = 0;
6868
}
69-
size_t max_length = src->Prec - start;
69+
size_t max_length = (size_t)((ssize_t)src->Prec - start);
7070
memcpy(dest, src->frac + start, Min(length, max_length) * sizeof(DECDIG));
7171
}
7272

@@ -101,28 +101,28 @@ divmod_newton(VALUE x, VALUE y, VALUE *div_out, VALUE *mod_out) {
101101
BDVALUE div_result = NewZeroWrap(1, BIGDECIMAL_COMPONENT_FIGURES * (num_blocks * block_figs + 1));
102102
BDVALUE bdx = GetBDValueMust(x);
103103

104-
VALUE mod = BigDecimal_fix(BigDecimal_decimal_shift(x, SSIZET2NUM(-num_blocks * block_digits)));
105-
for (ssize_t i = num_blocks - 1; i >= 0; i--) {
104+
VALUE mod = BigDecimal_fix(BigDecimal_decimal_shift(x, SSIZET2NUM(-(ssize_t)(num_blocks * block_digits))));
105+
for (ssize_t i = (ssize_t)(num_blocks - 1); i >= 0; i--) {
106106
memset(divident.real->frac, 0, (y_figs + block_figs) * sizeof(DECDIG));
107107

108108
BDVALUE bdmod = GetBDValueMust(mod);
109109
slice_copy(divident.real->frac, bdmod.real, 0, y_figs);
110-
slice_copy(divident.real->frac + y_figs, bdx.real, i * block_figs, block_figs);
110+
slice_copy(divident.real->frac + y_figs, bdx.real, (size_t)i * block_figs, block_figs);
111111
RB_GC_GUARD(bdmod.bigdecimal);
112112

113113
VpSetSign(divident.real, 1);
114-
divident.real->exponent = y_figs + block_figs;
114+
divident.real->exponent = (ssize_t)(y_figs + block_figs);
115115
divident.real->Prec = y_figs + block_figs;
116116
VpNmlz(divident.real);
117117

118118
VALUE div;
119119
divmod_by_inv_mul(divident.bigdecimal, y, yinv, &div, &mod);
120120
BDVALUE bddiv = GetBDValueMust(div);
121-
slice_copy(div_result.real->frac + (num_blocks - i - 1) * block_figs, bddiv.real, 0, block_figs + 1);
121+
slice_copy(div_result.real->frac + (num_blocks - (size_t)i - 1) * block_figs, bddiv.real, 0, block_figs + 1);
122122
RB_GC_GUARD(bddiv.bigdecimal);
123123
}
124124
VpSetSign(div_result.real, 1);
125-
div_result.real->exponent = num_blocks * block_figs + 1;
125+
div_result.real->exponent = (ssize_t)(num_blocks * block_figs + 1);
126126
div_result.real->Prec = num_blocks * block_figs + 1;
127127
VpNmlz(div_result.real);
128128
RB_GC_GUARD(bdx.bigdecimal);
@@ -148,8 +148,8 @@ VpDivdNewtonInner(VALUE args_ptr)
148148
VpAsgn(b2.real, b, 1);
149149
VpSetSign(a2.real, 1);
150150
VpSetSign(b2.real, 1);
151-
a2.real->exponent = base_prec + div_prec;
152-
b2.real->exponent = base_prec;
151+
a2.real->exponent = (ssize_t)(base_prec + div_prec);
152+
b2.real->exponent = (ssize_t)base_prec;
153153

154154
if ((ssize_t)a2.real->Prec > a2.real->exponent) {
155155
a2_frac = BigDecimal_frac(a2.bigdecimal);
@@ -164,9 +164,9 @@ VpDivdNewtonInner(VALUE args_ptr)
164164
VpAsgn(r, r2.real, VpGetSign(a));
165165
AddExponent(c, a->exponent);
166166
AddExponent(c, -b->exponent);
167-
AddExponent(c, -div_prec);
167+
AddExponent(c, -(ssize_t)div_prec);
168168
AddExponent(r, a->exponent);
169-
AddExponent(r, -base_prec - div_prec);
169+
AddExponent(r, -(ssize_t)(base_prec + div_prec));
170170
RB_GC_GUARD(a2.bigdecimal);
171171
RB_GC_GUARD(a2.bigdecimal);
172172
RB_GC_GUARD(c2.bigdecimal);

ext/bigdecimal/ntt.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ ntt(int size_bits, uint32_t *input, uint32_t *output, uint32_t *tmp, int r_base,
6868

6969
// rmax**(1 << shift) % prime == 1
7070
// r**size % prime == 1
71-
uint32_t rmax = mod_pow(r_base, base, prime);
71+
uint32_t rmax = mod_pow((uint32_t)r_base, (uint32_t)base, prime);
7272
uint32_t r = mod_pow(rmax, (uint32_t)1 << (shift - size_bits), prime);
7373

7474
if (dir < 0) r = mod_pow(r, prime - 2, prime);
@@ -123,7 +123,7 @@ ntt_multiply(size_t a_size, size_t b_size, uint32_t *a, uint32_t *b, uint32_t *c
123123
return;
124124
}
125125

126-
int ntt_size_bits = bit_length(b_size - 1) + 1;
126+
int ntt_size_bits = (int)bit_length(b_size - 1) + 1;
127127
if (ntt_size_bits > MAX_NTT32_BITS) {
128128
rb_raise(rb_eArgError, "Multiply size too large");
129129
}
@@ -177,12 +177,12 @@ ntt_multiply(size_t a_size, size_t b_size, uint32_t *a, uint32_t *b, uint32_t *c
177177
// so this sum doesn't overflow uint32_t.
178178
for (int j = 0; j < 3; j++) {
179179
// Index check: if dig[j] is non-zero, assign index is within valid range.
180-
if (dig[j]) c[idx * batch_size + i + 1 - j] += dig[j];
180+
if (dig[j]) c[idx * batch_size + i + 1 - (uint32_t)j] += dig[j];
181181
}
182182
}
183183
}
184184
uint32_t carry = 0;
185-
for (int32_t i = (uint32_t)(a_size + b_size - 1); i >= 0; i--) {
185+
for (int32_t i = (int32_t)(a_size + b_size - 1); i >= 0; i--) {
186186
uint32_t v = c[i] + carry;
187187
c[i] = v % NTT_DECDIG_BASE;
188188
carry = v / NTT_DECDIG_BASE;

0 commit comments

Comments
 (0)