srand man
говорит, что srand
имеет в качестве параметра unsignd int, , но при использовании без литья компиляция не жалуется. Есть ли шанс ошибиться, если вы не используете литые с (unsigned int)
? Или не делает различий, потому что компилятор всегда будет конвертировать его неявно?Что происходит за кулисами, если параметр srand-функции является отрицательным int?
В качестве примера, код ниже:
#include<stdio.h>
#include<stdlib.h>
int
main(void)
{
int num, x;
x = -2;
srand(x);
num = rand() % 100000;
printf("%d\n", num);
return 0;
}
Печать этого кода:
32
я буду считать, что компилятор будет неявно преобразовать переменную х типа int
в unsigned int
, Что происходит в этом преобразовании? Что делать, если преобразование преобразует переменную (которая имеет тип int
) в unsigned int
, то есть то же значение, что и другое число , что после того, как семя было сгенерировано, они будут идентичными. Другими словами:
int x = -2;
int y = 546; // the number 546 is just an example !
int num_x = srand(-2);
int num_y = srand(546);
И behinde сцены, num_x
равно num_y
.
Это сомнение появилось, когда у меня был отрицательный параметр на моем srand, и я сомневался, будет ли это семя уникальным. Я думаю, что это не так, потому что для примера, код ниже:
#include<stdio.h>
#include<stdlib.h>
int
main(void)
{
int t, num;
t = -6;
printf("%u\n", t); // prints the variable t as unsigned (implicitly converted)
srand(t);
num = rand() % 100000;
printf("Random number: %d\n", num);
srand(4294967290); // the number 4294967290 is how the int number -6 looks like when converted in unsigned int
num = rand() % 100000;
printf("New random number: %d\n", num);
return 0;
}
Выход из него:
4294967290
Random number: 19
New random number: 19
Таким образом, всегда отрицательные числа после конвертированы будет вести себя, как это? Как мне позаботиться об этом?
Еще один вопрос, который вы, возможно, знаете, я заметил, что подобное поведение появляется, когда я пытаюсь назначить переменной 'int' число, большее, чем оно поддерживает. Итак, каков расчет, чтобы узнать, какое значение он будет хранить в переменной, в которой я пытался сохранить большее значение, чем он поддерживает? Это поможет мне узнать, как это реализовано. – ViniciusArruda
Первое спасибо за ссылку, мне очень поможет, но, извините за настоятельную необходимость, я прочитал документы, но не нашел того, что показывало, как количество хранимых случаев больше, чем тип поддержки. Мне хотелось бы что-то вроде сеанса 6.3.1.3, который подробно рассказывает. – ViniciusArruda
Я думаю, что понял. Я нашел что-то в Интернете, говоря о переполнении целого числа. Итак, в этом случае, вот что я имею в виду? Или целочисленное переполнение существует только при наличии арифметики? [integer overflow] (http://en.wikipedia.org/wiki/Integer_overflow) и [неопределенное поведение] (http://en.wikipedia.org/wiki/Undefined_behavior) – ViniciusArruda