Liste des Groupes | Revenir à c arch |
David Brown wrote:for (int i = START; i > -1; i-- ) {On 05/09/2024 11:12, Terje Mathisen wrote:Loop counters of the for (i= 0; i < LIMIT; i++) type are of course fine with unsigned i, arrays always use a zero base so in Rust the only array index type is usize, i.e the largest supported unsigned type in the system, typically the same as u64.David Brown wrote:>Unsigned types are ideal for "raw" memory access or external data, for anything involving bit manipulation (use of &, |, ^, << and >> on signed types is usually wrong, IMHO), as building blocks in extended arithmetic types, for the few occasions when you want two's complement wrapping, and for the even fewer occasions when you actually need that last bit of range.>
That last paragraph enumerates pretty much all the uses I have for integer-type variables, with (like Mitch) a few apis that use (-1) as an error signal that has to be handled with special code.
>
You don't have loop counters, array indices, or integer arithmetic?
unsigned arithmetic is easier than signed integer arithmetic, including comparisons that would result in a negative value, you just have to make the test before subtracting, instead of checking if the result was negative.
I.e I cannot easily replicate a downward loop that exits when the counter become negative:
for (int i = START; i >= 0; i-- ) {
// Do something with data[i]
}
One of my alternatives areany unsigned integer cannot be less than zero?
unsigned u = start; // Cannot be less than zero
if (u) {
u++;
do {
u--;
data[u]...
while (u);
}
This typically results in effectively the same asm code as the signed version, except for a bottom JGE (Jump (signed) Greater or Equal instead of JA (Jump Above or Equal, but my version is far more verbose.
Alternatively, if you don't need all N bits of the unsigned type, then you can subtract and check if the top bit is set in the result:
for (unsigned u = start; (u & TOPBIT) == 0; u--)
Terje
Les messages affichés proviennent d'usenet.