The unpac monorepo manager self-hosting as a monorepo using unpac
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Add {Int32,Int64,Nativeint}.unsigned_{compare,div,rem}

+271 -18
+33
stdlib/int32.ml
··· 52 52 let max_int = 0x7FFFFFFFl 53 53 let lognot n = logxor n (-1l) 54 54 55 + let unsigned_to_int = 56 + match Sys.word_size with 57 + | 32 -> 58 + let max_int = of_int Stdlib.max_int in 59 + fun n -> 60 + if compare zero n <= 0 && compare n max_int <= 0 then 61 + Some (to_int n) 62 + else 63 + None 64 + | 64 -> 65 + (* So that it compiles in 32-bit *) 66 + let move = int_of_string "0x1_0000_0000" in 67 + fun n -> let i = to_int n in Some (if i < 0 then i + move else i) 68 + | _ -> 69 + assert false 70 + 55 71 external format : string -> int32 -> string = "caml_int32_format" 56 72 let to_string n = format "%d" n 57 73 ··· 66 82 67 83 let compare (x: t) (y: t) = Stdlib.compare x y 68 84 let equal (x: t) (y: t) = compare x y = 0 85 + 86 + let unsigned_compare n m = 87 + compare (sub n min_int) (sub m min_int) 88 + 89 + (* Unsigned division from signed division of the same 90 + bitness. See Warren Jr., Henry S. (2013). Hacker's Delight (2 ed.), Sec 9-3. 91 + *) 92 + let unsigned_div n d = 93 + if d < zero then 94 + if unsigned_compare n d < 0 then zero else one 95 + else 96 + let q = shift_left (div (shift_right_logical n 1) d) 1 in 97 + let r = sub n (mul q d) in 98 + if unsigned_compare r d >= 0 then succ q else q 99 + 100 + let unsigned_rem n d = 101 + sub n (mul (unsigned_div n d) d)
+25
stdlib/int32.mli
··· 60 60 argument is zero. This division rounds the real quotient of 61 61 its arguments towards zero, as specified for {!Stdlib.(/)}. *) 62 62 63 + val unsigned_div : int32 -> int32 -> int32 64 + (** Same as {!div}, except that arguments and result are interpreted as {e 65 + unsigned} 32-bit integers. 66 + 67 + @since 4.08.0 *) 68 + 63 69 external rem : int32 -> int32 -> int32 = "%int32_mod" 64 70 (** Integer remainder. If [y] is not zero, the result 65 71 of [Int32.rem x y] satisfies the following property: 66 72 [x = Int32.add (Int32.mul (Int32.div x y) y) (Int32.rem x y)]. 67 73 If [y = 0], [Int32.rem x y] raises [Division_by_zero]. *) 74 + 75 + val unsigned_rem : int32 -> int32 -> int32 76 + (** Same as {!rem}, except that arguments and result are interpreted as {e 77 + unsigned} 32-bit integers. 78 + 79 + @since 4.08.0 *) 68 80 69 81 val succ : int32 -> int32 70 82 (** Successor. [Int32.succ x] is [Int32.add x Int32.one]. *) ··· 121 133 during the conversion. On 64-bit platforms, the conversion 122 134 is exact. *) 123 135 136 + val unsigned_to_int : int32 -> int option 137 + (** Same as {!to_int}, but interprets the argument as an {e unsigned} integer. 138 + Returns [None] if the unsigned value of the argument cannot fit into an 139 + [int]. 140 + 141 + @since 4.08.0 *) 142 + 124 143 external of_float : float -> int32 125 144 = "caml_int32_of_float" "caml_int32_of_float_unboxed" 126 145 [@@unboxed] [@@noalloc] ··· 183 202 {!Stdlib.compare}. Along with the type [t], this function [compare] 184 203 allows the module [Int32] to be passed as argument to the functors 185 204 {!Set.Make} and {!Map.Make}. *) 205 + 206 + val unsigned_compare: t -> t -> int 207 + (** Same as {!compare}, except that arguments are interpreted as {e unsigned} 208 + 32-bit integers. 209 + 210 + @since 4.08.0 *) 186 211 187 212 val equal: t -> t -> bool 188 213 (** The equal function for int32s.
+25
stdlib/int64.ml
··· 50 50 let max_int = 0x7FFFFFFFFFFFFFFFL 51 51 let lognot n = logxor n (-1L) 52 52 53 + let unsigned_to_int = 54 + let max_int = of_int Stdlib.max_int in 55 + fun n -> 56 + if compare zero n <= 0 && compare n max_int <= 0 then 57 + Some (to_int n) 58 + else 59 + None 60 + 53 61 external format : string -> int64 -> string = "caml_int64_format" 54 62 let to_string n = format "%d" n 55 63 ··· 73 81 74 82 let compare (x: t) (y: t) = Stdlib.compare x y 75 83 let equal (x: t) (y: t) = compare x y = 0 84 + 85 + let unsigned_compare n m = 86 + compare (sub n min_int) (sub m min_int) 87 + 88 + (* Unsigned division from signed division of the same 89 + bitness. See Warren Jr., Henry S. (2013). Hacker's Delight (2 ed.), Sec 9-3. 90 + *) 91 + let unsigned_div n d = 92 + if d < zero then 93 + if unsigned_compare n d < 0 then zero else one 94 + else 95 + let q = shift_left (div (shift_right_logical n 1) d) 1 in 96 + let r = sub n (mul q d) in 97 + if unsigned_compare r d >= 0 then succ q else q 98 + 99 + let unsigned_rem n d = 100 + sub n (mul (unsigned_div n d) d)
+25
stdlib/int64.mli
··· 60 60 argument is zero. This division rounds the real quotient of 61 61 its arguments towards zero, as specified for {!Stdlib.(/)}. *) 62 62 63 + val unsigned_div : int64 -> int64 -> int64 64 + (** Same as {!div}, except that arguments and result are interpreted as {e 65 + unsigned} 64-bit integers. 66 + 67 + @since 4.08.0 *) 68 + 63 69 external rem : int64 -> int64 -> int64 = "%int64_mod" 64 70 (** Integer remainder. If [y] is not zero, the result 65 71 of [Int64.rem x y] satisfies the following property: 66 72 [x = Int64.add (Int64.mul (Int64.div x y) y) (Int64.rem x y)]. 67 73 If [y = 0], [Int64.rem x y] raises [Division_by_zero]. *) 74 + 75 + val unsigned_rem : int64 -> int64 -> int64 76 + (** Same as {!rem}, except that arguments and result are interpreted as {e 77 + unsigned} 64-bit integers. 78 + 79 + @since 4.08.0 *) 68 80 69 81 val succ : int64 -> int64 70 82 (** Successor. [Int64.succ x] is [Int64.add x Int64.one]. *) ··· 121 133 is taken modulo 2{^31}, i.e. the top 33 bits are lost 122 134 during the conversion. *) 123 135 136 + val unsigned_to_int : int64 -> int option 137 + (** Same as {!to_int}, but interprets the argument as an {e unsigned} integer. 138 + Returns [None] if the unsigned value of the argument cannot fit into an 139 + [int]. 140 + 141 + @since 4.08.0 *) 142 + 124 143 external of_float : float -> int64 125 144 = "caml_int64_of_float" "caml_int64_of_float_unboxed" 126 145 [@@unboxed] [@@noalloc] ··· 203 222 {!Stdlib.compare}. Along with the type [t], this function [compare] 204 223 allows the module [Int64] to be passed as argument to the functors 205 224 {!Set.Make} and {!Map.Make}. *) 225 + 226 + val unsigned_compare: t -> t -> int 227 + (** Same as {!compare}, except that arguments are interpreted as {e unsigned} 228 + 64-bit integers. 229 + 230 + @since 4.08.0 *) 206 231 207 232 val equal: t -> t -> bool 208 233 (** The equal function for int64s.
+25
stdlib/nativeint.ml
··· 49 49 let max_int = sub min_int 1n 50 50 let lognot n = logxor n (-1n) 51 51 52 + let unsigned_to_int = 53 + let max_int = of_int Stdlib.max_int in 54 + fun n -> 55 + if compare zero n <= 0 && compare n max_int <= 0 then 56 + Some (to_int n) 57 + else 58 + None 59 + 52 60 external format : string -> nativeint -> string = "caml_nativeint_format" 53 61 let to_string n = format "%d" n 54 62 ··· 63 71 64 72 let compare (x: t) (y: t) = Stdlib.compare x y 65 73 let equal (x: t) (y: t) = compare x y = 0 74 + 75 + let unsigned_compare n m = 76 + compare (sub n min_int) (sub m min_int) 77 + 78 + (* Unsigned division from signed division of the same 79 + bitness. See Warren Jr., Henry S. (2013). Hacker's Delight (2 ed.), Sec 9-3. 80 + *) 81 + let unsigned_div n d = 82 + if d < zero then 83 + if unsigned_compare n d < 0 then zero else one 84 + else 85 + let q = shift_left (div (shift_right_logical n 1) d) 1 in 86 + let r = sub n (mul q d) in 87 + if unsigned_compare r d >= 0 then succ q else q 88 + 89 + let unsigned_rem n d = 90 + sub n (mul (unsigned_div n d) d)
+25
stdlib/nativeint.mli
··· 63 63 argument is zero. This division rounds the real quotient of 64 64 its arguments towards zero, as specified for {!Stdlib.(/)}. *) 65 65 66 + val unsigned_div : nativeint -> nativeint -> nativeint 67 + (** Same as {!div}, except that arguments and result are interpreted as {e 68 + unsigned} native integers. 69 + 70 + @since 4.08.0 *) 71 + 66 72 external rem : nativeint -> nativeint -> nativeint = "%nativeint_mod" 67 73 (** Integer remainder. If [y] is not zero, the result 68 74 of [Nativeint.rem x y] satisfies the following properties: ··· 70 76 [x = Nativeint.add (Nativeint.mul (Nativeint.div x y) y) 71 77 (Nativeint.rem x y)]. 72 78 If [y = 0], [Nativeint.rem x y] raises [Division_by_zero]. *) 79 + 80 + val unsigned_rem : nativeint -> nativeint -> nativeint 81 + (** Same as {!rem}, except that arguments and result are interpreted as {e 82 + unsigned} native integers. 83 + 84 + @since 4.08.0 *) 73 85 74 86 val succ : nativeint -> nativeint 75 87 (** Successor. ··· 138 150 integer (type [int]). The high-order bit is lost during 139 151 the conversion. *) 140 152 153 + val unsigned_to_int : nativeint -> int option 154 + (** Same as {!to_int}, but interprets the argument as an {e unsigned} integer. 155 + Returns [None] if the unsigned value of the argument cannot fit into an 156 + [int]. 157 + 158 + @since 4.08.0 *) 159 + 141 160 external of_float : float -> nativeint 142 161 = "caml_nativeint_of_float" "caml_nativeint_of_float_unboxed" 143 162 [@@unboxed] [@@noalloc] ··· 193 212 {!Stdlib.compare}. Along with the type [t], this function [compare] 194 213 allows the module [Nativeint] to be passed as argument to the functors 195 214 {!Set.Make} and {!Map.Make}. *) 215 + 216 + val unsigned_compare: t -> t -> int 217 + (** Same as {!compare}, except that arguments are interpreted as {e unsigned} 218 + native integers. 219 + 220 + @since 4.08.0 *) 196 221 197 222 val equal: t -> t -> bool 198 223 (** The equal function for native ints.
+86 -18
testsuite/tests/basic/boxedints.ml
··· 35 35 val sub: t -> t -> t 36 36 val mul: t -> t -> t 37 37 val div: t -> t -> t 38 + val unsigned_div: t -> t -> t 38 39 val rem: t -> t -> t 39 40 val logand: t -> t -> t 40 41 val logor: t -> t -> t ··· 44 45 val shift_right_logical: t -> int -> t 45 46 val of_int: int -> t 46 47 val to_int: t -> int 48 + val unsigned_to_int: t -> int option 47 49 val of_float: float -> t 48 50 val to_float: t -> float 49 51 val zero: t ··· 55 57 val to_string: t -> string 56 58 val of_string: string -> t 57 59 end 58 - val testcomp: t -> t -> bool*bool*bool*bool*bool*bool*int 60 + val testcomp: t -> t -> bool*bool*bool*bool*bool*bool*int*int 59 61 val skip_float_tests: bool 60 62 end 61 63 ··· 72 74 test 4 (to_int (of_int 0x3FFFFFFF)) 0x3FFFFFFF; 73 75 test 5 (to_int (of_int (-0x40000000))) (-0x40000000); 74 76 77 + testing_function "unsigned_to_int"; 78 + test 1 (unsigned_to_int (of_int 0)) (Some 0); 79 + test 2 (unsigned_to_int (of_int 123)) (Some 123); 80 + test 3 (unsigned_to_int minus_one) 81 + (match Sys.word_size with 82 + | 32 -> None 83 + | 64 -> Some (int_of_string "0xFFFFFFFF") 84 + | _ -> assert false); 85 + test 4 (unsigned_to_int max_int) 86 + (match Sys.word_size with 87 + | 32 -> None 88 + | 64 -> Some (to_int max_int) 89 + | _ -> assert false); 90 + test 5 (unsigned_to_int min_int) 91 + (match Sys.word_size with 92 + | 32 -> None 93 + | 64 -> Some (int_of_string "0x80000000") 94 + | _ -> assert false); 95 + test 6 (unsigned_to_int (of_int Stdlib.max_int)) 96 + (match Sys.word_size with 97 + | 32 -> Some Stdlib.max_int 98 + | 64 -> Some (int_of_string "0xFFFFFFFF") 99 + | _ -> assert false); 100 + 75 101 testing_function "of_string"; 76 102 test 1 (of_string "0") (of_int 0); 77 103 test 2 (of_string "123") (of_int 123); ··· 170 196 11, 1234567, -12345678]; 171 197 test 12 (div min_int (of_int (-1))) min_int; 172 198 199 + testing_function "unsigned_div"; 200 + List.iter 201 + (fun (n, a, b, c) -> test n (unsigned_div a b) c) 202 + [1, of_int 0, of_int 2, of_int 0; 203 + 2, of_int 123, of_int 1, of_int 123; 204 + 3, of_int (-123), of_int 1, of_int (-123); 205 + 4, of_int (123), of_int (-1), of_int 0; 206 + 5, of_int (-123), of_int (-1), of_int 0; 207 + 6, of_int 127531236, of_int 365, of_int (127531236/365); 208 + 7, of_int 16384, of_int 256, of_int (16384/256); 209 + 8, of_int (-1), of_int 2, max_int; 210 + 9, of_int (-1), max_int, of_int 2; 211 + 10, min_int, of_int 2, shift_left (of_int 1) 30; 212 + 11, of_int (-1), of_int 8, shift_right_logical (of_int (-1)) 3]; 213 + 173 214 testing_function "mod"; 174 215 List.iter 175 216 (fun (n, a, b) -> test n (rem (of_int a) (of_int b)) (of_int (a mod b))) ··· 271 312 272 313 testing_function "Comparisons"; 273 314 test 1 (testcomp (of_int 0) (of_int 0)) 274 - (true,false,false,false,true,true,0); 315 + (true,false,false,false,true,true,0,0); 275 316 test 2 (testcomp (of_int 1234567) (of_int 1234567)) 276 - (true,false,false,false,true,true,0); 317 + (true,false,false,false,true,true,0, 0); 277 318 test 3 (testcomp (of_int 0) (of_int 1)) 278 - (false,true,true,false,true,false,-1); 319 + (false,true,true,false,true,false,-1,-1); 279 320 test 4 (testcomp (of_int (-1)) (of_int 0)) 280 - (false,true,true,false,true,false,-1); 321 + (false,true,true,false,true,false,-1,1); 281 322 test 5 (testcomp (of_int 1) (of_int 0)) 282 - (false,true,false,true,false,true,1); 323 + (false,true,false,true,false,true,1,1); 283 324 test 6 (testcomp (of_int 0) (of_int (-1))) 284 - (false,true,false,true,false,true,1); 325 + (false,true,false,true,false,true,1,-1); 285 326 test 7 (testcomp max_int min_int) 286 - (false,true,false,true,false,true,1); 327 + (false,true,false,true,false,true,1,-1); 287 328 288 329 () 289 330 end ··· 302 343 test 3 (to_int (of_int (-456))) (-456); 303 344 test 4 (to_int (of_int 0x3FFFFFFF)) 0x3FFFFFFF; 304 345 test 5 (to_int (of_int (-0x40000000))) (-0x40000000); 346 + 347 + testing_function "unsigned_to_int"; 348 + test 1 (unsigned_to_int (of_int 0)) (Some 0); 349 + test 2 (unsigned_to_int (of_int 123)) (Some 123); 350 + test 3 (unsigned_to_int minus_one) None; 351 + test 4 (unsigned_to_int max_int) None; 352 + test 5 (unsigned_to_int min_int) None; 353 + test 6 (unsigned_to_int (of_int Stdlib.max_int)) 354 + (Some Stdlib.max_int); 305 355 306 356 testing_function "of_string"; 307 357 test 1 (of_string "0") (of_int 0); ··· 406 456 11, 1234567, -12345678]; 407 457 test 12 (div min_int (of_int (-1))) min_int; 408 458 459 + testing_function "unsigned_div"; 460 + List.iter 461 + (fun (n, a, b, c) -> test n (unsigned_div a b) c) 462 + [1, of_int 0, of_int 2, of_int 0; 463 + 2, of_int 123, of_int 1, of_int 123; 464 + 3, of_int (-123), of_int 1, of_int (-123); 465 + 4, of_int (123), of_int (-1), of_int 0; 466 + 5, of_int (-123), of_int (-1), of_int 0; 467 + 6, of_int 127531236, of_int 365, of_int (127531236/365); 468 + 7, of_int 16384, of_int 256, of_int (16384/256); 469 + 8, of_int (-1), of_int 2, max_int; 470 + 9, of_int (-1), max_int, of_int 2; 471 + 10, min_int, of_int 2, shift_left (of_int 1) 62; 472 + 11, of_int (-1), of_int 8, shift_right_logical (of_int (-1)) 3]; 473 + 409 474 testing_function "mod"; 410 475 List.iter 411 476 (fun (n, a, b) -> test n (rem (of_int a) (of_int b)) (of_int (a mod b))) ··· 489 554 490 555 testing_function "Comparisons"; 491 556 test 1 (testcomp (of_int 0) (of_int 0)) 492 - (true,false,false,false,true,true,0); 557 + (true,false,false,false,true,true,0,0); 493 558 test 2 (testcomp (of_int 1234567) (of_int 1234567)) 494 - (true,false,false,false,true,true,0); 559 + (true,false,false,false,true,true,0,0); 495 560 test 3 (testcomp (of_int 0) (of_int 1)) 496 - (false,true,true,false,true,false,-1); 561 + (false,true,true,false,true,false,-1,-1); 497 562 test 4 (testcomp (of_int (-1)) (of_int 0)) 498 - (false,true,true,false,true,false,-1); 563 + (false,true,true,false,true,false,-1,1); 499 564 test 5 (testcomp (of_int 1) (of_int 0)) 500 - (false,true,false,true,false,true,1); 565 + (false,true,false,true,false,true,1,1); 501 566 test 6 (testcomp (of_int 0) (of_int (-1))) 502 - (false,true,false,true,false,true,1); 567 + (false,true,false,true,false,true,1,-1); 503 568 test 7 (testcomp max_int min_int) 504 - (false,true,false,true,false,true,1); 569 + (false,true,false,true,false,true,1,-1); 505 570 506 571 () 507 572 end ··· 509 574 (******** The test proper **********) 510 575 511 576 let testcomp_int32 (a : int32) (b : int32) = 512 - (a = b, a <> b, a < b, a > b, a <= b, a >= b, compare a b) 577 + (a = b, a <> b, a < b, a > b, a <= b, a >= b, compare a b, 578 + Int32.unsigned_compare a b) 513 579 let testcomp_int64 (a : int64) (b : int64) = 514 - (a = b, a <> b, a < b, a > b, a <= b, a >= b, compare a b) 580 + (a = b, a <> b, a < b, a > b, a <= b, a >= b, compare a b, 581 + Int64.unsigned_compare a b) 515 582 let testcomp_nativeint (a : nativeint) (b : nativeint) = 516 - (a = b, a <> b, a < b, a > b, a <= b, a >= b, compare a b) 583 + (a = b, a <> b, a < b, a > b, a <= b, a >= b, compare a b, 584 + Nativeint.unsigned_compare a b) 517 585 518 586 let _ = 519 587 testing_function "-------- Int32 --------";
+12
testsuite/tests/basic/boxedints.reference
··· 3 3 4 4 of_int, to_int 5 5 1... 2... 3... 4... 5... 6 + unsigned_to_int 7 + 1... 2... 3... 4... 5... 6... 6 8 of_string 7 9 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 8 10 to_string, format ··· 17 19 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 12... 13... 18 20 div 19 21 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 12... 22 + unsigned_div 23 + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 20 24 mod 21 25 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 12... 22 26 and ··· 42 46 43 47 of_int, to_int 44 48 1... 2... 3... 4... 5... 49 + unsigned_to_int 50 + 1... 2... 3... 4... 5... 6... 45 51 of_string 46 52 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 47 53 to_string, format ··· 56 62 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 12... 13... 57 63 div 58 64 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 12... 65 + unsigned_div 66 + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 59 67 mod 60 68 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 12... 61 69 and ··· 77 85 78 86 of_int, to_int 79 87 1... 2... 3... 4... 5... 88 + unsigned_to_int 89 + 1... 2... 3... 4... 5... 6... 80 90 of_string 81 91 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 82 92 to_string, format ··· 91 101 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 12... 13... 92 102 div 93 103 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 12... 104 + unsigned_div 105 + 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 94 106 mod 95 107 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 12... 96 108 and
+3
utils/targetint.ml
··· 28 28 val sub : t -> t -> t 29 29 val mul : t -> t -> t 30 30 val div : t -> t -> t 31 + val unsigned_div : t -> t -> t 31 32 val rem : t -> t -> t 33 + val unsigned_rem : t -> t -> t 32 34 val succ : t -> t 33 35 val pred : t -> t 34 36 val abs : t -> t ··· 53 55 val of_string : string -> t 54 56 val to_string : t -> string 55 57 val compare: t -> t -> int 58 + val unsigned_compare : t -> t -> int 56 59 val equal: t -> t -> bool 57 60 val repr: t -> repr 58 61 val print : Format.formatter -> t -> unit
+12
utils/targetint.mli
··· 58 58 argument is zero. This division rounds the real quotient of 59 59 its arguments towards zero, as specified for {!Stdlib.(/)}. *) 60 60 61 + val unsigned_div : t -> t -> t 62 + (** Same as {!div}, except that arguments and result are interpreted as {e 63 + unsigned} 32-bit integers. *) 64 + 61 65 val rem : t -> t -> t 62 66 (** Integer remainder. If [y] is not zero, the result 63 67 of [Targetint.rem x y] satisfies the following properties: ··· 65 69 [x = Targetint.add (Targetint.mul (Targetint.div x y) y) 66 70 (Targetint.rem x y)]. 67 71 If [y = 0], [Targetint.rem x y] raises [Division_by_zero]. *) 72 + 73 + val unsigned_rem : t -> t -> t 74 + (** Same as {!rem}, except that arguments and result are interpreted as {e 75 + unsigned} integers. *) 68 76 69 77 val succ : t -> t 70 78 (** Successor. ··· 180 188 {!Stdlib.compare}. Along with the type [t], this function [compare] 181 189 allows the module [Targetint] to be passed as argument to the functors 182 190 {!Set.Make} and {!Map.Make}. *) 191 + 192 + val unsigned_compare: t -> t -> int 193 + (** Same as {!compare}, except that arguments are interpreted as {e unsigned} 194 + integers. *) 183 195 184 196 val equal: t -> t -> bool 185 197 (** The equal function for target ints. *)