C 当x=-3(双精度)时,(x<;8)返回false

C 当x=-3(双精度)时,(x<;8)返回false,c,if-statement,double,C,If Statement,Double,守则内容如下: if (chan->sampcnt < 8) { *data = 0; return; } 这是一个多线程应用程序。我不熟悉所有的代码,因为它是一个大型、复杂的项目。我怀疑sampcnt在另一个线程中被更改,但当错误发生时,它表现出惊人的规律性。这让我避开了某种原子性的小毛病;然而,这仍然是一个考虑因素。我还没有确定修改另一个线程中运行的chan->sampcnt的代码,但它可能就在那里 我只是想说清楚sampcnt是double类型,我敢肯定。它被

守则内容如下:

if (chan->sampcnt < 8)
{
    *data = 0;
    return;
}
这是一个多线程应用程序。我不熟悉所有的代码,因为它是一个大型、复杂的项目。我怀疑sampcnt在另一个线程中被更改,但当错误发生时,它表现出惊人的规律性。这让我避开了某种原子性的小毛病;然而,这仍然是一个考虑因素。我还没有确定修改另一个线程中运行的
chan->sampcnt
的代码,但它可能就在那里


我只是想说清楚
sampcnt
是double类型,我敢肯定。它被声明为double,调试器将其列为double。此外,chan是指向类型
struct channel\u struct

的指针,将其改写为以下形式将给编译器一个指出问题的机会

double toTest = chan->sampcnt;
if ( toTest < 8)
{
    *data = 0;
    return;
}
double-toTest=chan->sampcnt;
如果(测试值<8)
{
*数据=0;
返回;
}

将其改写为以下形式应该给编译器一个指出问题的机会

double toTest = chan->sampcnt;
if ( toTest < 8)
{
    *data = 0;
    return;
}
double-toTest=chan->sampcnt;
如果(测试值<8)
{
*数据=0;
返回;
}

可能您偶尔会覆盖chan->sampcnt,因此当它失败时实际上不是-3。。。这是一个常见的问题,尤其是当chan指向malloced内存时。您确实没有提供足够的信息,也没有进行足够的调试。例如,在进行测试之前,您可以将chan->sampcnt的值保存在一个全局变量中,然后在出现问题时检查该值,看看它是否真的是您期望的值。你应该做的最后一件事是假设编译器或硬件中有一个bug。。。它几乎肯定在您的程序中。

您可能偶尔会覆盖chan->sampcnt,因此当它失败时,它实际上不是-3。。。这是一个常见的问题,尤其是当chan指向malloced内存时。您确实没有提供足够的信息,也没有进行足够的调试。例如,在进行测试之前,您可以将chan->sampcnt的值保存在一个全局变量中,然后在出现问题时检查该值,看看它是否真的是您期望的值。你应该做的最后一件事是假设编译器或硬件中有一个bug。。。它几乎肯定在您的程序中。

inttest=(int)chan->sampcnt;
int test = (int)chan->sampcnt;
if ( test < 8)
{
   *data = 0;
   return;
}
如果(试验<8) { *数据=0; 返回; }

可能
chan->sampcnt
是无符号类型

int test=(int)chan->sampcnt;
如果(试验<8)
{
*数据=0;
返回;
}


可能
chan->sampcnt
是无符号类型

我们需要查看结构类型
chan
的定义。了解有关您的程序的更多详细信息也会很有帮助,比如它是否是多线程的,周围的代码在做什么,等等。我想知道您是否违反了别名规则,并使用不同类型的覆盖对象访问对象…具体来说,sampcnt是什么类型?除了添加更多信息,我倾向于支持投票结束……在比较无符号整数和有符号整数时,可能会出现类似的奇怪现象。例如:
unsignedlhs=-3;int-rhs=8;if(lhs
将条件评估为false(0),这是公认的违反直觉的。但是,您的标题意味着它属于
double
类型。这就是你的意思吗?你确定吗?除非调试器/编译器/硬件中存在错误(我严重怀疑这种可能性),否则
sampcnt
是双重的。我们需要查看结构类型
chan
的定义。了解有关您的程序的更多详细信息也会很有帮助,比如它是否是多线程的,周围的代码在做什么,等等。我想知道您是否违反了别名规则,并使用不同类型的覆盖对象访问对象…具体来说,sampcnt是什么类型?除了添加更多信息,我倾向于支持投票结束……在比较无符号整数和有符号整数时,可能会出现类似的奇怪现象。例如:
unsignedlhs=-3;int-rhs=8;if(lhs
将条件评估为false(0),这是公认的违反直觉的。但是,您的标题意味着它属于
double
类型。这就是你的意思吗?你确定吗?除非调试器/编译器/硬件中有bug(我严重怀疑这种可能性),然后,
sampcnt
是一个double。这并不是问题的答案……使用调试器时,此表单也更有用,因为在比较之前,您可以轻松检查chan->sampcnt的值。编译器不会指出任何东西,由于代码是有效的C。我使用lldb作为我的调试器,并在比较后检查
chan->sampcnt
。我不确定如何在比较之前捕获它,因为特定的代码块大量运行。我考虑过使用条件断点,但是
sampcnt=-3
在两次打嗝之间正确地运行了数千次。这并不是问题的真正答案…使用调试器时,这种形式也更有用,因为在比较之前,您可以轻松地检查chan->sampcnt的值。编译器不会指出任何东西,由于代码是有效的C。我使用lldb作为我的调试器,并在比较后检查
chan->sampcnt
。我不确定如何在比较之前捕获它,因为特定的代码块大量运行。我已经考虑过使用条件断点,但是
sampcnt=-3
在两次打嗝之间正确地运行了数千次条件断点。您应该做的最后一件事是假设编译器或硬件中存在错误。。。这几乎可以肯定是在你的节目里。我同意这个假定不变的值可能会被一个野生指针击倒。当我必须追踪d的时候