Ruby 4.1.0dev (2026-10-26 revision 6b15825df0fce73e868b99f98c689755e46cfc8c)
integer.c
1#include "prism/internal/integer.h"
2
3#include "prism/internal/allocator.h"
4#include "prism/internal/buffer.h"
5
6#include <assert.h>
7// Include sys/types.h before inttypes.h to work around an issue with certain
8// versions of GCC and newlib which causes omission of PRIu64 and the other
9// 64-bit macros (see 61ebe5123; the removal of defines.h dropped it).
10#include <sys/types.h>
11#include <inttypes.h>
12#include <stdbool.h>
13#include <stddef.h>
14#include <stdlib.h>
15#include <string.h>
16
21static void
22pm_integer_free(pm_integer_t *integer) {
23 if (integer->values) {
24 xfree(integer->values);
25 }
26}
27
32#define INTEGER_EXTRACT(integer, length_variable, values_variable) \
33 if ((integer)->values == NULL) { \
34 length_variable = 1; \
35 values_variable = &(integer)->value; \
36 } else { \
37 length_variable = (integer)->length; \
38 values_variable = (integer)->values; \
39 }
40
45static void
46big_add(pm_integer_t *destination, pm_integer_t *left, pm_integer_t *right, uint64_t base) {
47 size_t left_length;
48 uint32_t *left_values;
49 INTEGER_EXTRACT(left, left_length, left_values)
50
51 size_t right_length;
52 uint32_t *right_values;
53 INTEGER_EXTRACT(right, right_length, right_values)
54
55 size_t length = left_length < right_length ? right_length : left_length;
56 uint32_t *values = (uint32_t *) xmalloc(sizeof(uint32_t) * (length + 1));
57 if (values == NULL) return;
58
59 uint64_t carry = 0;
60 for (size_t index = 0; index < length; index++) {
61 uint64_t sum = carry + (index < left_length ? left_values[index] : 0) + (index < right_length ? right_values[index] : 0);
62 values[index] = (uint32_t) (sum % base);
63 carry = sum / base;
64 }
65
66 if (carry > 0) {
67 values[length] = (uint32_t) carry;
68 length++;
69 }
70
71 *destination = (pm_integer_t) { length, values, 0, false };
72}
73
79static void
80big_sub2(pm_integer_t *destination, pm_integer_t *a, pm_integer_t *b, pm_integer_t *c, uint64_t base) {
81 size_t a_length;
82 uint32_t *a_values;
83 INTEGER_EXTRACT(a, a_length, a_values)
84
85 size_t b_length;
86 uint32_t *b_values;
87 INTEGER_EXTRACT(b, b_length, b_values)
88
89 size_t c_length;
90 uint32_t *c_values;
91 INTEGER_EXTRACT(c, c_length, c_values)
92
93 uint32_t *values = (uint32_t*) xmalloc(sizeof(uint32_t) * a_length);
94 int64_t carry = 0;
95
96 for (size_t index = 0; index < a_length; index++) {
97 int64_t sub = (
98 carry +
99 a_values[index] -
100 (index < b_length ? b_values[index] : 0) -
101 (index < c_length ? c_values[index] : 0)
102 );
103
104 if (sub >= 0) {
105 values[index] = (uint32_t) sub;
106 carry = 0;
107 } else {
108 sub += 2 * (int64_t) base;
109 values[index] = (uint32_t) ((uint64_t) sub % base);
110 carry = sub / (int64_t) base - 2;
111 }
112 }
113
114 while (a_length > 1 && values[a_length - 1] == 0) a_length--;
115 *destination = (pm_integer_t) { a_length, values, 0, false };
116}
117
122static void
123karatsuba_multiply(pm_integer_t *destination, pm_integer_t *left, pm_integer_t *right, uint64_t base) {
124 size_t left_length;
125 uint32_t *left_values;
126 INTEGER_EXTRACT(left, left_length, left_values)
127
128 size_t right_length;
129 uint32_t *right_values;
130 INTEGER_EXTRACT(right, right_length, right_values)
131
132 if (left_length > right_length) {
133 size_t temporary_length = left_length;
134 left_length = right_length;
135 right_length = temporary_length;
136
137 uint32_t *temporary_values = left_values;
138 left_values = right_values;
139 right_values = temporary_values;
140 }
141
142 if (left_length <= 10) {
143 size_t length = left_length + right_length;
144 uint32_t *values = (uint32_t *) xcalloc(length, sizeof(uint32_t));
145 if (values == NULL) return;
146
147 for (size_t left_index = 0; left_index < left_length; left_index++) {
148 uint32_t carry = 0;
149 for (size_t right_index = 0; right_index < right_length; right_index++) {
150 uint64_t product = (uint64_t) left_values[left_index] * right_values[right_index] + values[left_index + right_index] + carry;
151 values[left_index + right_index] = (uint32_t) (product % base);
152 carry = (uint32_t) (product / base);
153 }
154 values[left_index + right_length] = carry;
155 }
156
157 while (length > 1 && values[length - 1] == 0) length--;
158 *destination = (pm_integer_t) { length, values, 0, false };
159 return;
160 }
161
162 if (left_length * 2 <= right_length) {
163 uint32_t *values = (uint32_t *) xcalloc(left_length + right_length, sizeof(uint32_t));
164
165 for (size_t start_offset = 0; start_offset < right_length; start_offset += left_length) {
166 size_t end_offset = start_offset + left_length;
167 if (end_offset > right_length) end_offset = right_length;
168
169 pm_integer_t sliced_left = {
170 .length = left_length,
171 .values = left_values,
172 .value = 0,
173 .negative = false
174 };
175
176 pm_integer_t sliced_right = {
177 .length = end_offset - start_offset,
178 .values = right_values + start_offset,
179 .value = 0,
180 .negative = false
181 };
182
183 pm_integer_t product;
184 karatsuba_multiply(&product, &sliced_left, &sliced_right, base);
185
186 uint32_t carry = 0;
187 for (size_t index = 0; index < product.length; index++) {
188 uint64_t sum = (uint64_t) values[start_offset + index] + product.values[index] + carry;
189 values[start_offset + index] = (uint32_t) (sum % base);
190 carry = (uint32_t) (sum / base);
191 }
192
193 if (carry > 0) values[start_offset + product.length] += carry;
194 pm_integer_free(&product);
195 }
196
197 *destination = (pm_integer_t) { left_length + right_length, values, 0, false };
198 return;
199 }
200
201 size_t half = left_length / 2;
202 pm_integer_t x0 = { half, left_values, 0, false };
203 pm_integer_t x1 = { left_length - half, left_values + half, 0, false };
204 pm_integer_t y0 = { half, right_values, 0, false };
205 pm_integer_t y1 = { right_length - half, right_values + half, 0, false };
206
207 pm_integer_t z0 = { 0 };
208 karatsuba_multiply(&z0, &x0, &y0, base);
209
210 pm_integer_t z2 = { 0 };
211 karatsuba_multiply(&z2, &x1, &y1, base);
212
213 // For simplicity to avoid considering negative values,
214 // use `z1 = (x0 + x1) * (y0 + y1) - z0 - z2` instead of original karatsuba algorithm.
215 pm_integer_t x01 = { 0 };
216 big_add(&x01, &x0, &x1, base);
217
218 pm_integer_t y01 = { 0 };
219 big_add(&y01, &y0, &y1, base);
220
221 pm_integer_t xy = { 0 };
222 karatsuba_multiply(&xy, &x01, &y01, base);
223
224 pm_integer_t z1;
225 big_sub2(&z1, &xy, &z0, &z2, base);
226
227 size_t length = left_length + right_length;
228 uint32_t *values = (uint32_t*) xcalloc(length, sizeof(uint32_t));
229
230 assert(z0.values != NULL);
231 memcpy(values, z0.values, sizeof(uint32_t) * z0.length);
232
233 assert(z2.values != NULL);
234 memcpy(values + 2 * half, z2.values, sizeof(uint32_t) * z2.length);
235
236 uint32_t carry = 0;
237 for(size_t index = 0; index < z1.length; index++) {
238 uint64_t sum = (uint64_t) carry + values[index + half] + z1.values[index];
239 values[index + half] = (uint32_t) (sum % base);
240 carry = (uint32_t) (sum / base);
241 }
242
243 for(size_t index = half + z1.length; carry > 0; index++) {
244 uint64_t sum = (uint64_t) carry + values[index];
245 values[index] = (uint32_t) (sum % base);
246 carry = (uint32_t) (sum / base);
247 }
248
249 while (length > 1 && values[length - 1] == 0) length--;
250 pm_integer_free(&z0);
251 pm_integer_free(&z1);
252 pm_integer_free(&z2);
253 pm_integer_free(&x01);
254 pm_integer_free(&y01);
255 pm_integer_free(&xy);
256
257 *destination = (pm_integer_t) { length, values, 0, false };
258}
259
267static const int8_t pm_integer_parse_digit_values[256] = {
268// 0 1 2 3 4 5 6 7 8 9 A B C D E F
269 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 0x
270 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 1x
271 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 2x
272 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, // 3x
273 -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 4x
274 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, // 5x
275 -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 6x
276 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 7x
277 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 8x
278 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 9x
279 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // Ax
280 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // Bx
281 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // Cx
282 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // Dx
283 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // Ex
284 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // Fx
285};
286
290static uint8_t
291pm_integer_parse_digit(const uint8_t character) {
292 int8_t value = pm_integer_parse_digit_values[character];
293 assert(value != -1 && "invalid digit");
294
295 return (uint8_t) value;
296}
297
302static void
303pm_integer_from_uint64(pm_integer_t *integer, uint64_t value, uint64_t base) {
304 if (value < base) {
305 integer->value = (uint32_t) value;
306 return;
307 }
308
309 size_t length = 0;
310 uint64_t length_value = value;
311 while (length_value > 0) {
312 length++;
313 length_value /= base;
314 }
315
316 uint32_t *values = (uint32_t *) xmalloc(sizeof(uint32_t) * length);
317 if (values == NULL) return;
318
319 for (size_t value_index = 0; value_index < length; value_index++) {
320 values[value_index] = (uint32_t) (value % base);
321 value /= base;
322 }
323
324 integer->length = length;
325 integer->values = values;
326}
327
333static void
334pm_integer_normalize(pm_integer_t *integer) {
335 if (integer->values == NULL) {
336 return;
337 }
338
339 while (integer->length > 1 && integer->values[integer->length - 1] == 0) {
340 integer->length--;
341 }
342
343 if (integer->length > 1) {
344 return;
345 }
346
347 uint32_t value = integer->values[0];
348 bool negative = integer->negative && value != 0;
349
350 pm_integer_free(integer);
351 *integer = (pm_integer_t) { .values = NULL, .value = value, .length = 0, .negative = negative };
352}
353
358static void
359pm_integer_convert_base(pm_integer_t *destination, const pm_integer_t *source, uint64_t base_from, uint64_t base_to) {
360 size_t source_length;
361 const uint32_t *source_values;
362 INTEGER_EXTRACT(source, source_length, source_values)
363
364 size_t bigints_length = (source_length + 1) / 2;
365 assert(bigints_length > 0);
366
367 pm_integer_t *bigints = (pm_integer_t *) xcalloc(bigints_length, sizeof(pm_integer_t));
368 if (bigints == NULL) return;
369
370 for (size_t index = 0; index < source_length; index += 2) {
371 uint64_t value = source_values[index] + base_from * (index + 1 < source_length ? source_values[index + 1] : 0);
372 pm_integer_from_uint64(&bigints[index / 2], value, base_to);
373 }
374
375 pm_integer_t base = { 0 };
376 pm_integer_from_uint64(&base, base_from, base_to);
377
378 while (bigints_length > 1) {
379 pm_integer_t next_base;
380 karatsuba_multiply(&next_base, &base, &base, base_to);
381
382 pm_integer_free(&base);
383 base = next_base;
384
385 size_t next_length = (bigints_length + 1) / 2;
386 pm_integer_t *next_bigints = (pm_integer_t *) xcalloc(next_length, sizeof(pm_integer_t));
387
388 for (size_t bigints_index = 0; bigints_index < bigints_length; bigints_index += 2) {
389 if (bigints_index + 1 == bigints_length) {
390 next_bigints[bigints_index / 2] = bigints[bigints_index];
391 } else {
392 pm_integer_t multiplied = { 0 };
393 karatsuba_multiply(&multiplied, &base, &bigints[bigints_index + 1], base_to);
394
395 big_add(&next_bigints[bigints_index / 2], &bigints[bigints_index], &multiplied, base_to);
396 pm_integer_free(&bigints[bigints_index]);
397 pm_integer_free(&bigints[bigints_index + 1]);
398 pm_integer_free(&multiplied);
399 }
400 }
401
402 xfree_sized(bigints, bigints_length * sizeof(pm_integer_t));
403 bigints = next_bigints;
404 bigints_length = next_length;
405 }
406
407 *destination = bigints[0];
408 destination->negative = source->negative;
409 pm_integer_normalize(destination);
410
411 xfree_sized(bigints, bigints_length * sizeof(pm_integer_t));
412 pm_integer_free(&base);
413}
414
415#undef INTEGER_EXTRACT
416
420static void
421pm_integer_parse_powof2(pm_integer_t *integer, uint32_t base, const uint8_t *digits, size_t digits_length) {
422 size_t bit = 1;
423 while (base > (uint32_t) (1 << bit)) bit++;
424
425 size_t length = (digits_length * bit + 31) / 32;
426 uint32_t *values = (uint32_t *) xcalloc(length, sizeof(uint32_t));
427
428 for (size_t digit_index = 0; digit_index < digits_length; digit_index++) {
429 size_t bit_position = bit * (digits_length - digit_index - 1);
430 uint32_t value = digits[digit_index];
431
432 size_t index = bit_position / 32;
433 size_t shift = bit_position % 32;
434
435 values[index] |= value << shift;
436 if (32 - shift < bit) values[index + 1] |= value >> (32 - shift);
437 }
438
439 while (length > 1 && values[length - 1] == 0) length--;
440 *integer = (pm_integer_t) { .length = length, .values = values, .value = 0, .negative = false };
441 pm_integer_normalize(integer);
442}
443
447static void
448pm_integer_parse_decimal(pm_integer_t *integer, const uint8_t *digits, size_t digits_length) {
449 const size_t batch = 9;
450 const size_t length = (digits_length + batch - 1) / batch;
451
452 uint32_t *values = (uint32_t *) xcalloc(length, sizeof(uint32_t));
453 uint32_t value = 0;
454
455 for (size_t digits_index = 0; digits_index < digits_length; digits_index++) {
456 value = value * 10 + digits[digits_index];
457
458 size_t reverse_index = digits_length - digits_index - 1;
459 if (reverse_index % batch == 0) {
460 values[reverse_index / batch] = value;
461 value = 0;
462 }
463 }
464
465 // Convert base from 10**9 to 1<<32.
466 pm_integer_convert_base(integer, &((pm_integer_t) { .length = length, .values = values, .value = 0, .negative = false }), 1000000000, ((uint64_t) 1 << 32));
467 xfree_sized(values, length * sizeof(uint32_t));
468}
469
473static void
474pm_integer_parse_big(pm_integer_t *integer, uint32_t multiplier, const uint8_t *start, const uint8_t *end) {
475 // Allocate an array to store digits.
476 const size_t digits_capa = sizeof(uint8_t) * (size_t) (end - start);
477 uint8_t *digits = xmalloc(digits_capa);
478 size_t digits_length = 0;
479
480 for (; start < end; start++) {
481 if (*start == '_') continue;
482 digits[digits_length++] = pm_integer_parse_digit(*start);
483 }
484
485 // Construct pm_integer_t from the digits.
486 if (multiplier == 10) {
487 pm_integer_parse_decimal(integer, digits, digits_length);
488 } else {
489 pm_integer_parse_powof2(integer, multiplier, digits, digits_length);
490 }
491
492 xfree_sized(digits, digits_capa);
493}
494
500void
501pm_integer_parse(pm_integer_t *integer, pm_integer_base_t base, const uint8_t *start, const uint8_t *end) {
502 // Ignore unary +. Unary - is parsed differently and will not end up here.
503 // Instead, it will modify the parsed integer later.
504 if (*start == '+') start++;
505
506 // Determine the multiplier from the base, and skip past any prefixes.
507 uint32_t multiplier = 10;
508 switch (base) {
509 case PM_INTEGER_BASE_DEFAULT:
510 while (start < end && *start == '0') start++; // 01 -> 1
511 break;
512 case PM_INTEGER_BASE_BINARY:
513 start += 2; // 0b
514 multiplier = 2;
515 break;
516 case PM_INTEGER_BASE_OCTAL:
517 start++; // 0
518 if (*start == '_' || *start == 'o' || *start == 'O') start++; // o
519 multiplier = 8;
520 break;
521 case PM_INTEGER_BASE_DECIMAL:
522 if (*start == '0' && (end - start) > 1) start += 2; // 0d
523 break;
524 case PM_INTEGER_BASE_HEXADECIMAL:
525 start += 2; // 0x
526 multiplier = 16;
527 break;
528 case PM_INTEGER_BASE_UNKNOWN:
529 if (*start == '0' && (end - start) > 1) {
530 switch (start[1]) {
531 case '_': start += 2; multiplier = 8; break;
532 case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': start++; multiplier = 8; break;
533 case 'b': case 'B': start += 2; multiplier = 2; break;
534 case 'o': case 'O': start += 2; multiplier = 8; break;
535 case 'd': case 'D': start += 2; break;
536 case 'x': case 'X': start += 2; multiplier = 16; break;
537 default: assert(false && "unreachable"); break;
538 }
539 }
540 break;
541 }
542
543 // It's possible that we've consumed everything at this point if there is an
544 // invalid integer. If this is the case, we'll just return 0.
545 if (start >= end) return;
546
547 const uint8_t *cursor = start;
548 uint64_t value = (uint64_t) pm_integer_parse_digit(*cursor++);
549
550 for (; cursor < end; cursor++) {
551 if (*cursor == '_') continue;
552 value = value * multiplier + (uint64_t) pm_integer_parse_digit(*cursor);
553
554 if (value > UINT32_MAX) {
555 // If the integer is too large to fit into a single uint32_t, then
556 // we'll parse it as a big integer.
557 pm_integer_parse_big(integer, multiplier, start, end);
558 return;
559 }
560 }
561
562 integer->value = (uint32_t) value;
563}
564
570int
571pm_integer_compare(const pm_integer_t *left, const pm_integer_t *right) {
572 if (left->negative != right->negative) return left->negative ? -1 : 1;
573 int negative = left->negative ? -1 : 1;
574
575 if (left->values == NULL && right->values == NULL) {
576 if (left->value < right->value) return -1 * negative;
577 if (left->value > right->value) return 1 * negative;
578 return 0;
579 }
580
581 if (left->values == NULL || left->length < right->length) return -1 * negative;
582 if (right->values == NULL || left->length > right->length) return 1 * negative;
583
584 for (size_t index = 0; index < left->length; index++) {
585 size_t value_index = left->length - index - 1;
586 uint32_t left_value = left->values[value_index];
587 uint32_t right_value = right->values[value_index];
588
589 if (left_value < right_value) return -1 * negative;
590 if (left_value > right_value) return 1 * negative;
591 }
592
593 return 0;
594}
595
599void pm_integers_reduce(pm_integer_t *numerator, pm_integer_t *denominator) {
600 // If either the numerator or denominator do not fit into a 32-bit integer,
601 // then this function is a no-op. In the future, we may consider reducing
602 // even the larger numbers, but for now we're going to keep it simple.
603 if (
604 // If the numerator doesn't fit into a 32-bit integer, return early.
605 numerator->length != 0 ||
606 // If the denominator doesn't fit into a 32-bit integer, return early.
607 denominator->length != 0 ||
608 // If the numerator is 0, then return early.
609 numerator->value == 0 ||
610 // If the denominator is 1, then return early.
611 denominator->value == 1
612 ) return;
613
614 // Find the greatest common divisor of the numerator and denominator.
615 uint32_t divisor = numerator->value;
616 uint32_t remainder = denominator->value;
617
618 while (remainder != 0) {
619 uint32_t temporary = remainder;
620 remainder = divisor % remainder;
621 divisor = temporary;
622 }
623
624 // Divide the numerator and denominator by the greatest common divisor.
625 numerator->value /= divisor;
626 denominator->value /= divisor;
627}
628
632void
633pm_integer_string(pm_buffer_t *buffer, const pm_integer_t *integer) {
634 if (integer->negative) {
635 pm_buffer_append_byte(buffer, '-');
636 }
637
638 // If the integer fits into a single uint32_t, then we can just append the
639 // value directly to the buffer.
640 if (integer->values == NULL) {
641 pm_buffer_append_format(buffer, "%" PRIu32, integer->value);
642 return;
643 }
644
645 // If the integer is two uint32_t values, then we can | them together and
646 // append the result to the buffer.
647 if (integer->length == 2) {
648 const uint64_t value = ((uint64_t) integer->values[0]) | ((uint64_t) integer->values[1] << 32);
649 pm_buffer_append_format(buffer, "%" PRIu64, value);
650 return;
651 }
652
653 // Otherwise, first we'll convert the base from 1<<32 to 10**9.
654 pm_integer_t converted = { 0 };
655 pm_integer_convert_base(&converted, integer, (uint64_t) 1 << 32, 1000000000);
656
657 if (converted.values == NULL) {
658 pm_buffer_append_format(buffer, "%" PRIu32, converted.value);
659 pm_integer_free(&converted);
660 return;
661 }
662
663 // Allocate a buffer that we'll copy the decimal digits into.
664 const size_t digits_length = converted.length * 9;
665 char *digits = xcalloc(digits_length, sizeof(char));
666 if (digits == NULL) return;
667
668 // Pack bigdecimal to digits.
669 for (size_t value_index = 0; value_index < converted.length; value_index++) {
670 uint32_t value = converted.values[value_index];
671
672 for (size_t digit_index = 0; digit_index < 9; digit_index++) {
673 digits[digits_length - 9 * value_index - digit_index - 1] = (char) ('0' + value % 10);
674 value /= 10;
675 }
676 }
677
678 size_t start_offset = 0;
679 while (start_offset < digits_length - 1 && digits[start_offset] == '0') start_offset++;
680
681 // Finally, append the string to the buffer and free the digits.
682 pm_buffer_append_string(buffer, digits + start_offset, digits_length - start_offset);
683 xfree_sized(digits, sizeof(char) * digits_length);
684 pm_integer_free(&converted);
685}
#define xfree
Old name of ruby_xfree.
Definition xmalloc.h:58
#define xmalloc
Old name of ruby_xmalloc.
Definition xmalloc.h:53
#define xcalloc
Old name of ruby_xcalloc.
Definition xmalloc.h:55
C99 shim for <stdbool.h>
A structure represents an arbitrary-sized integer.
Definition integer.h:16
size_t length
The number of allocated values.
Definition integer.h:21
uint32_t value
Embedded value for small integer.
Definition integer.h:32
uint32_t * values
List of 32-bit integers.
Definition integer.h:26
bool negative
Whether or not the integer is negative.
Definition integer.h:38