代码之家  ›  专栏  ›  技术社区  ›  Ahmed Mohamed Ashraf

如何在ANSI C中计算整数数据类型的范围

  •  -3
  • Ahmed Mohamed Ashraf  · 技术社区  · 9 年前

    在ANSI C中,计算有符号、无符号、短和长数据类型范围的数学公式是什么?

    2 回复  |  直到 9 年前
        1
  •  3
  •   mch    9 年前

    无符号类型的范围为 0 2^(effective number of bits used by the type) - 1

    签名类型具有定义的最小实现:

    2的补码 -(2^(effective number of bits used by the type - 1))
    所有其他 -(2^(effective number of bits used by the type - 1) - 1)

    签名类型的最大值为 2^(effective number of bits used by the type - 1) - 1

    ^ 是幂函数,而不是xor。

        2
  •  0
  •   Jency    5 年前
    /* Hope it helps
     * C Program to Print the Range~~ Google
     */
    #include <stdio.h>
    #define SIZE(x) sizeof(x)*8
    
    void signed_one(int);
    void unsigned_one(int);
    
    void main()
    {
        printf("\nrange of int");
        signed_one(SIZE(int));
        printf("\nrange of unsigned int");
        unsigned_one(SIZE(unsigned int));
        printf("\nrange of char");
        signed_one(SIZE(char));
        printf("\nrange of unsigned char");
        unsigned_one(SIZE(unsigned char));
        printf("\nrange of short");
        signed_one(SIZE(short));
        printf("\nrange of unsigned short");
        unsigned_one(SIZE(unsigned short));
    
    }
    /* RETURNS THE RANGE SIGNED*/
    void signed_one(int count)
    {
        int min, max, pro;
        pro = 1;
        while (count != 1)
        {
            pro = pro << 1;
            count--;
        }
        min = ~pro;
        min = min + 1;
        max = pro - 1;
        printf("\n%d to %d", min, max);
    }
    /* RETURNS THE RANGE UNSIGNED */
    void unsigned_one(int count)
    {
        unsigned int min, max, pro = 1;
    
        while (count != 0)
        {
            pro = pro << 1;
            count--;
        }
        min = 0;
        max = pro - 1;
        printf("\n%u to %u", min, max);
    }
    

    程序说明

    1. 将字节数乘以8,将字节数转换为位。
    2. 使用signed_one()和unsigned_one)两个函数分别计算有符号和无符号数据类型的范围。
    3. 步骤1中获得的值作为参数发送给两个函数。在这两个函数中,它都由变量计数接收。
    4. 在两个函数中将变量pro初始化为1。
    5. 在函数signed_one()中,使用while循环,条件为(count!=1),将变量pro向左移动1个位置,然后将变量count连续递减1。
    6. 当循环终止时,将pro的补码分配给变量min,并将min递增1。减小变量pro并将其分配给变量max。将min和max打印为输出。
    7. 在函数unsigned_one()中,使用while循环,条件为(count!=0),将变量pro向左移动1个位置,然后将变量count连续递减1。
    8. 当循环终止时,将零分配给变量min。减小变量pro并将其分配给变量max。将最小值和最大值打印为输出。