Mi sono imbattuto in un interessante problema teorico alcuni anni fa. Non ho mai trovato una soluzione, e continua a tormentarmi quando dormo.
Supponiamo di avere un'applicazione (C #) che contiene un numero in un int, chiamato x. (Il valore di x non è fisso). Quando viene eseguito il programma, x viene moltiplicato per 33 e quindi scritto in un file.
Il codice sorgente di base è simile a questo:
int x = getSomeInt();
x = x * 33;
file.WriteLine(x); // Writes x to the file in decimal format
Alcuni anni dopo, scopri che hai bisogno dei valori originali di X. Alcuni calcoli sono semplici: basta dividere il numero nel file per 33. Tuttavia, in altri casi, X è abbastanza grande che la moltiplicazione ha causato un overflow di numeri interi. Secondo i documenti , C # troncherà i bit di ordine superiore fino a quando il numero è inferiore a int.MaxValue
. In questo caso è possibile:
- Recupera X stesso o
- Recupera una lista di possibili valori per X?
Mi sembra (anche se la mia logica potrebbe essere imperfetta) che uno o entrambi dovrebbero essere possibili, dal momento che il caso più semplice di aggiunta funziona (Essenzialmente se si aggiunge 10 a X e si avvolge, si può sottrarre 10 e finire con X di nuovo) e la moltiplicazione è semplicemente aggiunta ripetuta. Anche aiutare (credo) è il fatto che X è moltiplicato per lo stesso valore in tutti i casi - una costante 33.
Questo ha ballato intorno al mio cranio in momenti strani per anni. Mi verrà in mente, passerò un po 'di tempo a cercare di pensarci, e poi me ne dimenticherò per qualche mese. Sono stanco di rincorrere questo problema! Qualcuno può offrire informazioni?
(Nota a margine: non so davvero come taggare questo. Suggerimenti accetti.)
Modifica: mi permetta di chiarire che se riesco a ottenere un elenco di possibili valori per X, ci sono altri test che potrei fare per aiutarmi a ridurlo al valore originale.