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

时间:2013-11-15 10:39:08

标签: c

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

我做了什么? 我已经使用sizeof运算符实现了这个,然后计算了类型中的位数,并使用它来计算最大值和最小值。

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;
}

2 个答案:

答案 0 :(得分:2)

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

在您的情况下,您在ilcs获得-1,因为它包含所有的。

用1初始化它们并保持左移1(不按位或)。

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

答案 1 :(得分:0)

一旦您正确计算了MIN_INT = - (MAX_INT + 1)

MAX_INT可能是最简单的公式。

因此,对于32位有符号整数,MAX_INT = + 2,147,483,683,因此MIN_INT = - (MAX_INT + 1)= -2,147,483,684。