Преобразование из unsigned long int в подписанное int и наоборот - PullRequest
0 голосов
/ 27 июля 2011

Я хотел бы передать подписанный int на gsl_rng_uniform_int (const gsl_rng * r, unsigned long int n).Подписанный int, который я передаю, больше или равен нулю.Функция будет возвращать число от 0 до n, поэтому, если я передам ей int со знаком плюс, она вернет что-то, находящееся в диапазоне целого числа со знаком.Затем я хочу сохранить возвращаемое значение в подписанном int.Какой самый чистый способ сделать это с очевидным ожидаемым поведением?Я на 64-битном компиляторе на 64-битной машине Linux.

Обновление Извините, ребята.Пожалуйста, игнорируйте.Проблема с моим кодом была на самом деле в другом месте.Я неправильно интерпретировал вывод gdb.

Ответы [ 2 ]

2 голосов
/ 27 июля 2011

Начните с:

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

Вероятно, компилятор предупредит о небезопасном сужающемся преобразовании, поэтому измените на:

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

Или для безопасности:

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

Эти строки могут быть заключены во вспомогательную функцию:

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;
}

В любом случае тестирование вашего ввода, как правило, более полезно, чем тестирование вывода функций, на которые вы полагаетесь, и если вы доверяете gsl_rng_uniform_int, то тестирования ввода достаточно.

[Правка: вау, Google очень агрессивно индексирует. Я просто искал, чтобы проверить, что gsl_rng_uniform_signed уже не является функцией, и нашел себя.]

1 голос
/ 27 июля 2011

Если функция ожидает unsigned long, вы можете без проблем передать unsigned long, unsigned int, unsigned short и unsigned char, стандарт гарантирует это.

Если вы передадите signed, но отрицательный int, вы не получите правильные результаты, так как функция будет вычислена с очень большим значением int.

Лучший способ - проверить, является ли int со знаком >= 0 перед его передачей.

Надеюсь, я правильно понял ваш вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...