【问题标题】:what's wrong with this c codes? [closed]这个c代码有什么问题? [关闭]
【发布时间】:2015-02-23 20:24:49
【问题描述】:
#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);
}

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

【问题讨论】:

    标签: c dev-c++


    【解决方案1】:

    你想知道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;
    }
    

    最后,一个更好的解决方案(无循环)将是

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

    【讨论】:

    • 第二种方法很不错!适用于 2 的补码。对于不常见的符号幅度和 1 的补码,请以 max = 1 开头。
    • 1 票赞成的好答案
    【解决方案2】:

    如果你真的想计算这个值,你可以使用这个

    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

    【讨论】:

    • 1) 更常见的最小值是-integer - 1。 2)这种方法的一个例子without a loop
    • 这假定char 的大小始终为八位。你应该改用CHAR_BIT。
    【解决方案3】:

    试试标准 C 库中的limits.h。它包含INT_MIN 和INT_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;
    }
    

    【讨论】:

      【解决方案4】:

      这两个代码示例都依赖未定义的行为来确定 int 的最大值。没有为 int 这样的签名数字定义溢出。

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

      如果您真的想以可移植的方式计算 INT_MAX 的值,那么您应该查看这个答案:Is there a portable way to define INT_MAX?

      【讨论】:

      • 我错过了主要问题。 +1 顺便说一句
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-31
      • 2014-08-12
      相关资源
      最近更新 更多