C语言中srand(time(NULL))和srand((unsigned)time(NULL))区别

time(NULL)返回的是1970年1月1日0点到现在间隔的时间秒数,本身是个正数,为什么还要取无符号?... time(NULL)返回的是1970年1月1日0点到现在间隔的时间秒数,本身是个正数,为什么还要取无符号? 展开
 我来答
solidco2
推荐于2016-06-16 · 知道合伙人软件行家
solidco2
知道合伙人软件行家
采纳数:126 获赞数:539

向TA提问 私信TA
展开全部

从结果上来看是没有任何区别的,对一个整数取其无符号数之后,存储在内存中的值没有任何变化。先说结论,稍后给你证明

-----------------------------------------------------

下面是我写了一段简单的测试代码,运行环境是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位长整形来保存秒,甚至毫秒,这样临界点问题就不是我们这个物种该考虑的问题了

金色潜鸟
2015-06-18 · TA获得超过3.2万个赞
知道大有可为答主
回答量:1.3万
采纳率:89%
帮助的人:5749万
展开全部
没有区别。
不写 取无符号 它也会自动处理成 无符号。
无符号 是 srand() 参数的要求。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式