@@ -84,19 +84,15 @@ module integer_mate::i128 {
8484 }
8585
8686 public fun sub (num1: I128 , num2: I128 ): I128 {
87- let sub_num = wrapping_add (I128 {
88- bits: u128_neg (num2.bits)
89- }, from (1 ));
90- add (num1, sub_num)
87+ let (v, overflow) = overflowing_sub (num1, num2);
88+ assert !(!overflow, EOverflow );
89+ v
9190 }
9291
9392 public fun overflowing_sub (num1: I128 , num2: I128 ): (I128 , bool ) {
94- let sub_num = wrapping_add (I128 {
95- bits: u128_neg (num2.bits)
96- }, from (1 ));
97- let sum = wrapping_add (num1, sub_num);
98- let overflow = (sign (num1) & sign (sub_num) & u8_neg (sign (sum))) + (u8_neg (sign (num1)) & u8_neg (sign (sub_num)) & sign (sum));
99- (sum, overflow != 0 )
93+ let v = wrapping_sub (num1, num2);
94+ let overflow = sign (num1) != sign (num2) && sign (num1) != sign (v);
95+ (v, overflow)
10096 }
10197
10298 public fun mul (num1: I128 , num2: I128 ): I128 {
@@ -336,16 +332,42 @@ module integer_mate::i128 {
336332 assert !(overflow == false && as_u128 (result) == MAX_AS_U128 - 1 , 1 );
337333 let (_, overflow) = overflowing_add (from (MAX_AS_U128 ), from (1 ));
338334 assert !(overflow == true , 1 );
335+ let (_, overflow) = overflowing_add (from (1 ), from (MAX_AS_U128 ));
336+ assert !(overflow == true , 1 );
339337 let (_, overflow) = overflowing_add (neg_from (MIN_AS_U128 ), neg_from (1 ));
340338 assert !(overflow == true , 1 );
339+ let (_, overflow) = overflowing_add (neg_from (1 ), neg_from (MIN_AS_U128 ));
340+ assert !(overflow == true , 1 );
341+ }
342+
343+ #[test]
344+ fun test_overflowing_sub () {
345+ let (_result, overflow) = overflowing_sub (from (0 ), neg_from (MIN_AS_U128 ));
346+ assert !(overflow == true , 1 );
347+ let (_result, overflow) = overflowing_sub (from (1 ), neg_from (MIN_AS_U128 ));
348+ assert !(overflow == true , 1 );
349+ let (_result, overflow) = overflowing_sub (neg_from (MIN_AS_U128 ), from (1 ));
350+ assert !(overflow == true , 1 );
351+ let (_result, overflow) = overflowing_sub (neg_from (MIN_AS_U128 ), from (0 ));
352+ assert !(overflow == false , 1 );
353+ let (_result, overflow) = overflowing_sub (from (MAX_AS_U128 ), neg_from (1 ));
354+ assert !(overflow == true , 1 );
355+ let (_result, overflow) = overflowing_sub (neg_from (2 ), from (MAX_AS_U128 ));
356+ assert !(overflow == true , 1 );
341357 }
342358
343359 #[test]
344360 #[expected_failure]
345- fun test_add_overflow () {
361+ fun test_add_overflow_max_1 () {
346362 add (from (MAX_AS_U128 ), from (1 ));
347363 }
348364
365+ #[test]
366+ #[expected_failure]
367+ fun test_add_overflow_1_max () {
368+ add (from (1 ), from (MAX_AS_U128 ));
369+ }
370+
349371 #[test]
350372 #[expected_failure]
351373 fun test_add_underflow () {
@@ -400,16 +422,68 @@ module integer_mate::i128 {
400422
401423 #[test]
402424 #[expected_failure]
403- fun test_sub_overflow () {
404- sub (from (MAX_AS_U128 ), neg_from (1 ));
425+ fun test_sub_overflow_0_min () {
426+ // 1 - i32::MIN
427+ sub (from (0 ), neg_from (MIN_AS_U128 ));
405428 }
406429
407430 #[test]
408431 #[expected_failure]
409- fun test_sub_underflow () {
432+ fun test_sub_overflow_1_min () {
433+ // 1 - i32::MIN
434+ sub (from (1 ), neg_from (MIN_AS_U128 ));
435+ }
436+
437+ #[test]
438+ #[expected_failure]
439+ fun test_sub_overflow_min_1 () {
410440 sub (neg_from (MIN_AS_U128 ), from (1 ));
411441 }
412442
443+ #[test]
444+ #[expected_failure]
445+ fun test_sub_overflow_max_n1 () {
446+ sub (from (MAX_AS_U128 ), neg_from (1 ));
447+ }
448+
449+ #[test]
450+ #[expected_failure]
451+ fun test_sub_overflow_n2_max () {
452+ sub (neg_from (2 ), from (MAX_AS_U128 ));
453+ }
454+
455+
456+ #[test]
457+ #[expected_failure]
458+ fun test_sub_overflow_10000_min () {
459+ //10000 - i32::MIN
460+ sub (from (10000 ), neg_from (MIN_AS_U128 ));
461+ }
462+
463+ #[test]
464+ #[expected_failure]
465+ fun test_sub_overflow_min_10000 () {
466+ sub (neg_from (MIN_AS_U128 ), from (10000 ));
467+ }
468+
469+ #[test]
470+ #[expected_failure]
471+ fun test_sub_overflow_min_max () {
472+ sub (neg_from (MIN_AS_U128 ), from (MAX_AS_U128 ));
473+ }
474+
475+ #[test]
476+ #[expected_failure]
477+ fun test_add_overflow_n1_min () {
478+ add (neg_from (1 ), neg_from (MIN_AS_U128 ));
479+ }
480+
481+ #[test]
482+ #[expected_failure]
483+ fun test_add_overflow_min_n1 () {
484+ add (neg_from (MIN_AS_U128 ), neg_from (1 ));
485+ }
486+
413487 #[test]
414488 fun test_mul () {
415489 assert !(as_u128 (mul (from (1 ), from (1 ))) == 1 , 0 );
0 commit comments