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

How to calculate the range of integer data types in ANSI C

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

无符号类型的范围从 02^(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

^是幂函数,不是异或。

/* 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 中获得的值作为参数发送到两个函数。在这两个函数中,它都是由变量 count 接收的。
  4. 在两个函数中将变量 pro 初始化为 1。
  5. 在函数signed_one()中使用while循环条件(count != 1),变量pro向左移动1位,变量count连续减1。
  6. 当循环终止时,将pro的补码赋值给变量min并将min加1。将变量pro减1并赋值给变量max。打印最小值和最大值作为输出。
  7. 在函数unsigned_one()中使用while循环条件(count !=0),将变量pro向左移动1位,并连续将变量count减1。
  8. 当循环终止时,将零赋值给变量min。递减变量 pro 并将其分配给变量 max。打印最小值和最大值作为输出。