Equivalent of atoi for unsigned integers
atoi, c, integer-overflow
Solution
The simple answer is to use `strtoul()` instead.
The longer answer is that even if all you needed was signed 32 bit integers or were happy with 31 bits for unsigned, the `atoi()` function is a poor fit for what you appear to be doing.
As you have already noted, the `atoi()` function converts a string to an integer. A normal, signed integer. However, what `atoi()` doesn't do is error handling. What `atoi()`'s specification says is "If the value cannot be represented, the behavior is undefined."
The strto*() family of functions all clearly specify how errors are handled, so you should in all cases replace `atoi()` with calls to `strtol()` (convert string to long), and in this case since you want to handle unsigned integers, you should use `strtoul()` (convert string to unsigned long).
Also note that if you want to handle larger numbers, there are the `strtoll()` and `strtoull()` functions, to convert your string to a long long or an unsigned long long. (And if you just want to handle the largest possible integral values without bothering with all that stuff in between, there's `strtoimax()` and `strtoumax()`, that return values of type `intmax_t` or `uintmax_t` respectively.)
POSIX Documentation:
- `atoi()`
- `strtol()`
- `strtoll()`
- `strtoul()`
- `strtoull()`
- `strtoimax()`
- `strtoumax()`
Problem
I'm doing two operations involving atoi and I'm wondering how I can do this with unsigned integers because atoi seems to convert these to signed causing a wraparound integer overflow. I want to work with 32bit unsigned integers but atoi is limiting me effectively to 31bit unsigned. ``` if (multiplication_is_safe(atoi(argv[1]),atoi(argv[3]))) { printf("%s * %s = %u \n", argv[1], argv[3], atoi(argv[1]) * atoi(argv[3])); return 0; } else ```