C语言中srand(time(NULL))和srand((unsigned)time(NULL))区别
从结果上来看是没有任何区别的,对一个整数取其无符号数之后,存储在内存中的值没有任何变化。先说结论,稍后给你证明
-----------------------------------------------------
下面是我写了一段简单的测试代码,运行环境是32位环境(和操作系统位长无关,只和编译器定义有关),此时 int 的长度是32位的(sizeof(int)可以获取当前运行时的int字节长度,乘以8就是位长,在turboC2.0里面int是16位的)
#include <stdio.h>
void mytest(unsigned n) {
//此处函数定义用的是无符号型,无论你传进来的是有无符号,都会当做无符号来用
printf("Hex: %*X, Dec: %u\n", (int)sizeof(int) * 2, n, n);
}
void main() {
int n1 = -1234567890;
unsigned n2 = 3060399406;
//这里的n2和n1在内存空间里是相同的
//这两个数值的绝对值 1234567890 + 3060399406 = 4294967296 这就是2的32次方所有符合这个条件的正负数都是相等的
mytest(n1);
mytest(n2);
printf("%u == %d ? %d\n", n2, n1, n2 == n1);
}
这段程序的结果是:
Hex: B669FD2E, Dec: 3060399406
Hex: B669FD2E, Dec: 3060399406
3060399406 == -1234567890 ? 1
可见正负两个数传进函数中,值是完全相同的,甚至这两个数字直接用来做比较都是相等的,因为比较的时候他们会转换为同种类型。
下面的这段话跟前面的原理无关,我只说一下time这个函数的值。
time返回的确实是距离1970年初至今的秒数,这个秒数现在已经达到了14亿多,45年的时间,而有符号型能表示的最大值是 21亿多,当秒数到达这个最大值的时候,是2038年的某一天,所以产生了类似千年虫的2038问题,超过那个时间点,时间就会变成负数,所以就有了你上面看到的函数调用,强转成unsigned类型。应该能撑到2100年左右,那时候就让孙子们去发愁吧。。。
不过这样其实也是有问题的,因为1970年以前的时间本身是用负数保存的,比如1969年12月31日23点59分59秒,保存的值就是-1,而转成无符号数的话,就会变成2038年的临界点的下一秒的时间。所以这不是解决问题的根本方法。更好的方法是用64位长整形来保存秒,甚至毫秒,这样临界点问题就不是我们这个物种该考虑的问题了