整数既不是非负的也不是非正的?

时间:2013-08-23 11:55:41

标签: c++ nan

我有这个:

void foo()
{
    int i = /*something*/
    int j = -i;

    if ((i >= 0) || (j >= 0))
        return;

    std::cout << "Worked";
}

首先,我尝试分配std::numeric_limits<int>::quiet_NaN,但它返回零。在这里,我发现整数值不能是NaN(这意味着整数总是通过if(i!=i){...}测试)。所以我的问题是:是否可以在i中为foo()变量分配内容以执行输出?

7 个答案:

答案 0 :(得分:4)

假设您的原始标题是正确的

i == 0是非负面和非正面。但是为了让输出“工作”,您需要将if()谓词更改为仅如果ij为负数,则返回

#include <iostream>

void foo()
{
    int i = 0;
    int j = -i;

    if ((i >= 0) || !(j >= 0))
        return;

    std::cout << "Worked";
}

int main()
{
    foo();    
}

Live Example

假设您的if()声明正确

您的if((i >= 0) || (j >= 0)) return;语句假设 i-i都不是。那么您可以查看@jrok使用UB技巧设置{{ 1}}。

但严肃地说,重新考虑你的计划的逻辑。

答案 1 :(得分:4)

这为我输出“工作”。不过,它是形式上未定义的。

#include <climits>

void foo()
{
    int i = INT_MIN;
    int j = -i;

    if ((i >= 0) || (j >= 0))
        return;

    std::cout << "Worked";
}

int main() { foo(); }

自担风险。

答案 2 :(得分:0)

除了变量之外,您还需要使用一些标志来指示您的变量是否可以使用。

没有办法制作一些正数和负数的整数(除了0,我猜)。

答案 3 :(得分:0)

不,您将找不到i使用此代码生成输出的任何值。永远不会; D

答案 4 :(得分:0)

int是一种基本类型,它只能 存储其范围内的整数值。

0既是非负的也是非正的。但是,没有办法按原样获取输出字符串。

答案 5 :(得分:0)

没有整数非数字。我不完全确定这一点,但是如果你的系统有陷阱整数值,那么使用它们时的行为在标准下是未定义的。

但是,对于大多数机器(使用2s补码算术)。所有整数值都是可比较的,并且没有不相等的数字。一个补码算术具有负零和正零,但是一个特定的零将等于它自己。

答案 6 :(得分:0)

身份-INT_MIN == INT_MIN是一个“事件”,只发生在2s补码签名算法的(非常流行的)架构上。除非您编写特定代码,否则请不要依赖它。它可以在不同的机器上表现不同。