好吧,我觉得我的问题比其他问题要复杂一些。
我在尝试解决时意识到了这一点。

我尝试使用

int number = rand() % (INT_MAX - INT_MIN + 1) + INT_MIN;
rand() % (INT_MAX + INT_MIN + 1) + rand() % INT_MIN;


但是,我得到了浮点异常8错误。没有警告,那真的很奇怪!

另外,从time.h开始,每次执行代码时,都会使用srand((unsigned)time(NULL))作为新的随机数。

但是无论我尝试什么,都会得到不正确的结果或浮点异常。

我真的很好奇溢出和下溢,它是如何发生的,
这样的随机数可以实际产生吗?

我基本上想在C中生成一个大于INT_MIN且小于INT_MAX的数字。

我尝试了很多逻辑,但结果不正确。

最佳答案

INT_MAX - INT_MIN + 1int溢出,因此未定义行为。

您的系统所经历的行为是除以0,这通常是INT_MAX - INT_MIN + 1-> 0的结果,尽管未指定。

rand()生成一个在int范围内的[0...RAND_MAX]。从RAND_MAX <= INT_MAX开始,可能需要多次调用才能在int范围内构造[0...INT_MAX],更不用说您对[INT_MIN...INT_MAX]的追求了。

下面是一种通用方法。它不是高效的,而是简单的,显然可以对各种类型进行修改。

int rand_int(void) {
  union {
    int i;
    unsigned char uc[sizeof (int)];
  } u;
  for (size_t i = 0; i < sizeof u.uc; i++) {
    u.uc[i] = rand();
  }
  return u.i;
}


从技术上讲,它可以在陷阱值为int的罕见机器上导致UB。

09-07 09:53