La conversione da unsigned long int signed int e viceversa

Vorrei passare signed int a gsl_rng_uniform_int (const gsl_rng * r, unsigned long int n). Il signed int che sto passando è maggiore o uguale a zero. La funzione restituisce un numero tra 0 e n, quindi se io passo un segno positivo int, avrà un ritorno di qualcosa che è nella gamma di signed int. Quindi, vorrei memorizzare il valore di ritorno in un signed int. Qual è il modo più pulito per fare questo con l’evidente comportamento atteso? Io sono su un compilatore a 64 bit e a 64-bit macchina Linux.

Aggiornamento
Ci dispiace, gente. Si prega di ignorare. Il problema con il mio codice era in realtà altrove. Ho male interpretato l’uscita di gdb.

InformationsquelleAutor mshang | 2011-07-27

 

2 Replies
  1. 2

    Iniziano con:

    int input = something;
    int result = gsl_rng_uniform_int(r, input);

    Probabilmente il compilatore segnala un pericoloso restringimento di conversione, in modo da modificare:

    //0 <= return value < input, so conversion is safe
    int result = (int) gsl_rng_uniform_int(r, input);

    O per la sicurezza:

    if (input <= 0) { panic(); }
    unsigned long rawresult = gsl_rng_uniform_int(r, input);
    if (rawresult > INT_MAX) { panic(); }
    int result = (int) rawresult;

    Quelle linee potrebbe essere avvolto in una funzione di supporto:

    int gsl_rng_uniform_signed(const gsl_rng *r, int input) {
        if (input <= 0) { panic(); }
        unsigned long rawresult = gsl_rng_uniform_int(r, input);
        if (rawresult > INT_MAX) { panic(); }
        return (int) rawresult;
    }

    In ogni caso il test di ingresso è in genere più utile che prova l’uscita di funzioni che si basano su, e se ti fidi di gsl_rng_uniform_int quindi il test di ingresso è sufficiente.

    [Edit: wow, indici di Google in MODO davvero aggressivo. Ho solo cercato di controllare che gsl_rng_uniform_signed non è già in funzione, e mi sono trovato.]

  2. 1

    Se la funzione si aspetta un unsigned long si può passare senza problemi da un unsigned long, unsigned int, unsigned short e unsigned char, lo standard garantisce che.

    Se si passa un signed ma negativo int, non si ottiene il risultato corretto, dal momento che sarà valutata per un grande int dalla funzione.

    Il modo migliore è quello di verificare se il signed int è >= 0 prima di passarlo.

    Spero che ho capito la tua domanda correttamente.

Lascia un commento