srand
的参数是一个无符号整型,但是如果不强制转换使用,编译器不会报错。
如果不使用(unsigned 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
的变量x转换为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);
在幕后,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
变量赋一个超过它支持的数字时,会出现类似的行为。那么,如何计算出在我尝试存储一个超过其支持范围的值的变量中将存储什么值?这将帮助我了解它是如何实现的。 - undefined