Domanda

Ho incontrato un bug in un codice C che ho scritto e, sebbene fosse relativamente facile da risolvere, voglio essere in grado di capire il problema alla base meglio. Essenzialmente quello che è successo è che avevo due numeri interi non firmati (uint32_t, in effetti) che, quando l'operazione del modulo veniva applicata, produceva l'equivalente non firmato di un numero negativo, un numero che era stato avvolto ed era quindi "grande". Ecco un programma di esempio per dimostrare:

#include <stdio.h>
#include <stdint.h>

int main(int argc, char* argv[]) {

  uint32_t foo = -1;
  uint32_t u   = 2048;
  uint64_t ul  = 2048;

  fprintf(stderr, "%d\n", foo);
  fprintf(stderr, "%u\n", foo);
  fprintf(stderr, "%lu\n", ((foo * 2600000000) % u));
  fprintf(stderr, "%ld\n", ((foo * 2600000000) % u));
  fprintf(stderr, "%lu\n", ((foo * 2600000000) % ul));
  fprintf(stderr, "%lu\n", foo % ul);

  return 0;

}

Questo produce il seguente output, sulla mia macchina X86_64:

-1
4294967295
18446744073709551104
-512
1536
2047

1536 è il numero che mi aspettavo, ma (uint32_t) (-512) è il numero che stavo ottenendo, che, come potresti immaginare, ha gettato un po 'le cose.

Quindi, immagino che la mia domanda sia questa: perché un'operazione di modulo tra due numeri non firmati, in questo caso, produce un numero maggiore del divisore (cioè un numero negativo)? C'è un motivo per cui questo comportamento è preferito?

Nessuna soluzione corretta

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top