如何查找数据类型的范围

How to find rangeof data type.?

本文关键字:数据类型 范围 查找 何查找      更新时间:2023-10-16

如何在不使用sizeof运算符或任何内置函数的情况下查找任何数据类型的范围?我正在使用逻辑将所有位分配给可用的位,然后打印它来尝试它。

您是否正在寻找

<limits> numeric_limits<int>::minnumeric_limits<int>::max


以下答案是不可移植的(它期望负数的二进制补码),但它可能是您正在寻找的:

unsigned_int_type UMAX = (unsigned_int_type) -1;
unsigned_int_type UMIN = 0;
signed_int_type MAX = (signed_int_type) (UMAX / 2);
signed_int_type MIN = (signed_int_type) (UMAX / 2 + 1);

例如

#include <stdio.h>
int main(void)
{
    unsigned long UMAX = (unsigned long) -1;
    unsigned long UMIN = 0;
    signed long MAX = (signed long) (UMAX / 2);
    signed long MIN = (signed long) (UMAX / 2 + 1);
    printf("UMAX = %lun", UMAX);
    printf("UMIN = %lun", UMIN);
    printf("MAX = %lin", MAX);
    printf("MIN = %lin", MIN);
    return 0;
}
UMAX = 18446744073709551615
UMIN = 0
MAX = 9223372036854775807
MIN = -9223372036854775808

您可以计算位数(假设我们不是在谈论浮点数或结构),例如

  • 将所有位设置为 1

  • 保持按位升移所有数据,直到值为零

    不要降档,因为这可能会导致标志扩展。

所以喜欢;

mytype value = ~0; // set all bits to one using first compliment
int numberOfBits = 0;
while (value) { 
  numberOfBits += 1;
  value <<= 1; // upshift
}

您现在有了位数,并且如果类型是有符号的还是无符号的,则范围为

0 .. (2^numberOfBits-1)

-2^(numberOfBits-1)..(2^(numberOfBits-1)-1)