c语言srand( time(null) ); 是什么意思,C语言中有关srand(time(NULL));的问题 为什么srand(time(NULL));放到上面不行呢?下面就可以?小白求解......

本文探讨了在32位环境下,将整数转换为无符号类型后内存存储值不变的现象,并揭示了time函数与时间戳上限的问题。通过实例展示了为什么正负数在特定情况下会得到相同结果,同时指出了使用无符号类型解决时间戳问题的局限性。

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值