我正在学习c语言,当我的代码应该是错误的时候,我的代码似乎将(1e16-1>=1e16)评估为真时,我感到困惑。我的代码在下面,它返回

9999999999999999 INVALIDBIG\n

当我希望它不会归还任何东西的时候。我认为使用long long可以避免任何与大数有关的问题。
int main(void)
{
    long long z;

    z = 9999999999999999;

    if ( z >= 1e16 || z < 0 )
    {
        printf("%lli INVALIDBIG\n",z);
    }
}

最佳答案

1e16是一个双精度文本值,浮点/双精度对于十进制算术/比较来说可能不精确(只是许多常见示例中的一个:十进制0.2)。它将把长z向上转换为double进行比较,我猜标准的double表示不能存储所需的精度(也许其他人可以演示二进制尾数/符号表示)
尝试将1e16更改为(长双精度)1e16,它不会打印出您的消息。(更新:或者,正如另一个问题注释者添加的那样,将1e16更改为整数文本)

09-05 17:22