这个c代码有什么问题?

时间:2014-12-26 14:52:52

标签: c dev-c++

#include <stdio.h>

int main() {

    int i = 1;
    int j = -1;

    while(i)
        i++;
    while(-j)
        j--;

    i = i-1;
    j = j+1;

    printf("%d %d\n",i,j);
}

我想知道int的范围!这段代码无法得到正确的答案!但它可以!

#include <stdio.h>

int main() {

    int i = 1;
    int j = -1;

    while(i > 0)
        i++;
    while(j < 0)
        j--;

    i = i-1;
    j = j+1;

    printf("%d %d\n",i,j);
}

我不知道它们之间有什么区别!

4 个答案:

答案 0 :(得分:5)

这两个代码示例都依赖于未定义的行为来确定int的最大值。未对像int等签名号码定义溢出。

要查找int的最大值,只需读取值INT_MAX

如果您真的想以便携方式计算INT_MAX的值,那么您应该查看以下答案:Is there a portable way to define INT_MAX?

答案 1 :(得分:4)

从标准C库中尝试limits.h。它包含两个常量定义INT_MININT_MAX,分别告诉您int的最小值和最大值。

#include <limits.h>
#include <stdio.h>

int main(int argc, char* argv[]) {
    printf("int min: %d, int max: %d\n", INT_MIN, INT_MAX);
    return 0;
}

答案 2 :(得分:3)

您想了解int的范围?

#include <stdio.h>
#include <limits.h>

int main()
{
    printf("%d, %d\n", INT_MIN, INT_MAX);
    return 0;
}

节目输出

-2147483648, 2147483647

根据@ iharob的回答,这是一个类似的解决方案,在没有UB的情况下达到极限。

#include <stdio.h>

int main()
{
    int integer = -1, max = 0;
    while (integer <<= 1)
        max = (max << 1) | 1;
    printf("%d\n", max);
    return 0;
}

最后,niftier解决方案(没有循环)将是

printf("Max int %d\n", (unsigned)-1 >> 1);

答案 3 :(得分:1)

如果您确实想要计算该值,可以使用此

int
main(int arcg, char **argv)
{
    int integer;
    int i;

    integer = 0;
    for (i = 0 ; i < 8 * sizeof (integer) - 1 ; i++)
    {
        integer |= (1 << i);
    }

    return 0;
}

然后最大值为integer,最小值为-integer