1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00

math.big: fix min i32 value bug (#17775)

* attempt big int min value fix

* cast value for correct comparison

* update edge case

* add one more test
This commit is contained in:
Subhomoy Haldar 2023-03-26 06:45:42 +01:00 committed by GitHub
parent 1fe5aca782
commit 8759409a69
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 17 additions and 2 deletions

View File

@ -198,6 +198,16 @@ fn test_integer_from_string() {
y := big.integer_from_int(int_values[index]) y := big.integer_from_int(int_values[index])
assert x == y assert x == y
} }
imin := big.integer_from_string('-2147483648') or {
panic('Minimum signed 32-bit int test fails.')
}
assert imin.int() == -2147483648
imax := big.integer_from_string('2147483647') or {
panic('Maximum signed 32-bit int test fails.')
}
assert imax.int() == 2147483647
} }
fn test_integer_from_powers_of_2() { fn test_integer_from_powers_of_2() {
@ -412,7 +422,7 @@ fn test_get_bit() {
'0000000000000000000000000000000000000000010000', '1110010', '0001001'] '0000000000000000000000000000000000000000010000', '1110010', '0001001']
for value in values { for value in values {
a := big.integer_from_radix(value, 2) or { panic('Could not read binary') } a := big.integer_from_radix(value, 2) or { panic('Could not read binary') }
bits := []bool{len: value.len, init: value[value.len - 1 - it] == `1`} bits := []bool{len: value.len, init: value[value.len - 1 - index] == `1`}
for i in 0 .. value.len { for i in 0 .. value.len {
assert a.get_bit(i) == bits[i] assert a.get_bit(i) == bits[i]
} }
@ -441,7 +451,7 @@ fn test_bit_len() ? {
assert big.one_int.lshift(1239).bit_len() == 1240 assert big.one_int.lshift(1239).bit_len() == 1240
mut num := big.integer_from_string('4338476092346017364013796407961305761039463198075691378460917856')? mut num := big.integer_from_string('4338476092346017364013796407961305761039463198075691378460917856')!
assert num.bit_len() == 212 assert num.bit_len() == 212
for num.bit_len() > 0 { for num.bit_len() > 0 {
num = num.rshift(8) num = num.rshift(8)

View File

@ -800,6 +800,11 @@ pub fn (a Integer) int() int {
if a.signum == 0 { if a.signum == 0 {
return 0 return 0
} }
// Check for minimum value int
if a.digits[0] == 2147483648 && a.signum == -1 {
return -2147483648
}
// Rest of the values should be fine
value := int(a.digits[0] & 0x7fffffff) value := int(a.digits[0] & 0x7fffffff)
return value * a.signum return value * a.signum
} }