Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C程序计算数据类型的范围_C - Fatal编程技术网

C程序计算数据类型的范围

C程序计算数据类型的范围,c,C,我编写这个程序是为了计算C中某些数据类型的最大值和最小值,即有符号数据类型。问题是它给出了正确的最大值,但给出了错误的最小值,尽管我认为我的逻辑是正确的。我知道有更好、更有效的方法来取得结果,我也实施了这些方法。只需要知道给定的代码哪里出错 我做了什么? 我已经使用sizeof操作符实现了这一点,然后计算类型中的位数,并使用它来计算max和min值 Thanx提前 /* * Program to calculate the size of various data types like : *

我编写这个程序是为了计算C中某些数据类型的最大值和最小值,即有符号数据类型。问题是它给出了正确的最大值,但给出了错误的最小值,尽管我认为我的逻辑是正确的。我知道有更好、更有效的方法来取得结果,我也实施了这些方法。只需要知道给定的代码哪里出错

我做了什么? 我已经使用sizeof操作符实现了这一点,然后计算类型中的位数,并使用它来计算max和min值

Thanx提前

/*
* Program to calculate the size of various data types like :
* int, long, short, char
*
* Version 3
*
* Problem with this version : Working correct only for maximum value of a
* data type.
*
* Author : Ravi Malik
*/

#include<stdio.h>

int main()
{   int i, i_prev ;
    long l, l_prev ;
    char c, c_prev ;
    short s, s_prev ;

    for( i = 0, i_prev = -1 ; i > i_prev ; i = i << 1 | 0x01 )
        i_prev = i ;

    for( l = 0, l_prev = -1 ; l > l_prev ; l = l << 1 | 0x01 )
        l_prev = l ;

    for( c = 0, c_prev = -1 ; c > c_prev ; c = c << 1 | 0x01 )
    c_prev = c ;

    for( s = 0, s_prev = -1 ; s > s_prev ; s = s << 1 | 0x01 )
    s_prev = s ;

printf("MAX_INT:%d and MIN_INT:%d\n",i_prev,i);
printf("MAX_LONG:%ld and MIN_INT:%ld\n",l_prev,l);
printf("MAX_CHAR:%d and MIN_CHAR:%d\n",c_prev,c);
printf("MAX_SHORT:%hd and MIN_SHORT:%hd\n",s_prev,s);

return 0;
}
/*
*用于计算各种数据类型大小的程序,如:
*int、long、short、char
*
*版本3
*
*此版本的问题:仅适用于a的最大值
*数据类型。
*
*作者:拉维·马利克
*/
#包括
int main()
{int i,i_prev;
长l,l_上;
字符c,c_prev;
短s,s_-prev;
对于(i=0,i_prev=-1;i>i_prev;i=l_prev;l=l c_prev;c=c s_prev;s=s
MIN_INT=-(MAX_INT+1)
可能是最简单的公式,只要你正确计算了
MAX_INT


因此,在32位有符号整数的情况下,
MAX_INT
=+2147483683,因此
MIN_INT
=-(
MAX_INT
+1)=-2147483684。

-1表示所有位都设置为1。在2的补码中,最小值为1,后跟零(仅适用于有符号数据类型)

在您的例子中,您在
i
l
c
s
中得到-1,因为它包含所有的值

用1初始化它们,并仅保持左移1(无位或)


用于(i=1,i_prev=-1;i>i_prev;i=i,以防您不知道:最有效的方法是使用
limits.h
中的常数。这段代码将为您提供正确的最小值,但不是正确的最大值。您需要在for循环之后添加一小段代码:
i_prev=i_prev*2-1
。这应该为您提供c更正上述任何数据类型的值。
for( i = 1, i_prev = -1 ; i > i_prev ; i = i << 1)
    i_prev = i ;