简体   繁体   中英

Converting from unsigned long int to signed int and vice versa

I would like to pass a signed int to gsl_rng_uniform_int (const gsl_rng * r, unsigned long int n) . The signed int that I'm passing is greater than or equal to zero. The function will return a number between 0 and n , so if I pass it a positive signed int, it will return something that is in the range of a signed int. I then want to store the return value in a signed int. What's the cleanest way to do this with the obvious expected behaviour? I'm on a 64-bit compiler on a 64-bit Linux machine.

Update Sorry, folks. Please ignore. The problem with my code was actually elsewhere. I misinterpreted the output of gdb .

Start with:

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

Likely the compiler will warn about an unsafe narrowing conversion, so change to:

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

Or for safety:

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

Those lines could be wrapped in a helper function:

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 any case testing your input is typically more useful than testing the output of functions you rely on, and if you trust gsl_rng_uniform_int then testing the input is sufficient.

[Edit: wow, Google indexes SO really aggressively. I just searched to check that gsl_rng_uniform_signed isn't already a function, and found myself.]

If the function expects an unsigned long you can pass with no problem an unsigned long , unsigned int , unsigned short and unsigned char , the standard guarantees that.

If you pass a signed but negative int , you will not obtain the correct results, since it will be evaluated to a very big int by the function.

The best way is to check if it the signed int is >= 0 before passing it.

I hope I understood your question correctly.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM