Blame


1 5dc21454 2023-07-14 jrmu /*
2 5dc21454 2023-07-14 jrmu * Exercise 3-4. In a two's complement number representation, our version of
3 5dc21454 2023-07-14 jrmu * itoa does not handle the largest negative number, that is, the value of n
4 5dc21454 2023-07-14 jrmu * equal to -(2^(wordsize-1)). Explain why not. Modify it to print that value
5 5dc21454 2023-07-14 jrmu * correctly, regardless of the machine on which it runs.
6 5dc21454 2023-07-14 jrmu */
7 5dc21454 2023-07-14 jrmu
8 5dc21454 2023-07-14 jrmu /* In the step n = -n, it is not possible to negate the largest negative
9 5dc21454 2023-07-14 jrmu * number without integer overflow.
10 5dc21454 2023-07-14 jrmu */
11 5dc21454 2023-07-14 jrmu
12 5dc21454 2023-07-14 jrmu #include <string.h>
13 5dc21454 2023-07-14 jrmu #include <stdio.h>
14 5dc21454 2023-07-14 jrmu #include <limits.h>
15 5dc21454 2023-07-14 jrmu
16 5dc21454 2023-07-14 jrmu void reverse(char s[]) {
17 5dc21454 2023-07-14 jrmu int c, i, j;
18 5dc21454 2023-07-14 jrmu for (i = 0, j = strlen(s)-1; i<j; i++, j--) {
19 5dc21454 2023-07-14 jrmu c = s[i];
20 5dc21454 2023-07-14 jrmu s[i] = s[j];
21 5dc21454 2023-07-14 jrmu s[j] = c;
22 5dc21454 2023-07-14 jrmu }
23 5dc21454 2023-07-14 jrmu }
24 5dc21454 2023-07-14 jrmu
25 5dc21454 2023-07-14 jrmu void itoa(int n, char s[]) {
26 5dc21454 2023-07-14 jrmu int i, sign;
27 5dc21454 2023-07-14 jrmu unsigned u;
28 5dc21454 2023-07-14 jrmu if ((sign = n) < 0)
29 5dc21454 2023-07-14 jrmu u = -n;
30 5dc21454 2023-07-14 jrmu i = 0;
31 5dc21454 2023-07-14 jrmu do {
32 5dc21454 2023-07-14 jrmu s[i++] = u % 10 + '0';
33 5dc21454 2023-07-14 jrmu } while ((u /= 10) > 0);
34 5dc21454 2023-07-14 jrmu if (sign < 0)
35 5dc21454 2023-07-14 jrmu s[i++] = '-';
36 5dc21454 2023-07-14 jrmu s[i] = '\0';
37 5dc21454 2023-07-14 jrmu reverse(s);
38 5dc21454 2023-07-14 jrmu }
39 5dc21454 2023-07-14 jrmu
40 5dc21454 2023-07-14 jrmu int main() {
41 5dc21454 2023-07-14 jrmu /* word size is 32 bits */
42 5dc21454 2023-07-14 jrmu char s[100];
43 5dc21454 2023-07-14 jrmu int i = -147483648;
44 5dc21454 2023-07-14 jrmu itoa(i, s);
45 5dc21454 2023-07-14 jrmu printf("Actual: %s\n", s);
46 5dc21454 2023-07-14 jrmu printf("Expect: %s\n", "-147483648");
47 5dc21454 2023-07-14 jrmu i = INT_MIN+1;
48 5dc21454 2023-07-14 jrmu itoa(i, s);
49 5dc21454 2023-07-14 jrmu printf("Actual: %s\n", s);
50 5dc21454 2023-07-14 jrmu printf("Expect: %d\n", INT_MIN+1);
51 5dc21454 2023-07-14 jrmu i = INT_MIN;
52 5dc21454 2023-07-14 jrmu itoa(i, s);
53 5dc21454 2023-07-14 jrmu printf("Actual: %s\n", s);
54 5dc21454 2023-07-14 jrmu printf("Expect: %d\n", INT_MIN);
55 5dc21454 2023-07-14 jrmu return 0;
56 5dc21454 2023-07-14 jrmu }