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

匿名用户

1级

2015-06-19 回答

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

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

下面是我写了一段简单的测试代码,运行环境是32位环境(和操作系统位长无关,只和编译器定义有关),此时 int 的长度是32位的(sizeof(int)可以获取当前运行时的int字节长度,乘以8就是位长,在turboC2.0里面int是16位的)

#include 

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位长整形来保存秒,甚至毫秒,这样临界点问题就不是我们这个物种该考虑的问题了

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值