如何查找数据类型范围。

时间:2014-11-13 19:52:39

标签: c++ c

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

2 个答案:

答案 0 :(得分:1)

您是否在numeric_limits<int>::max中寻找numeric_limits<int>::min<limits>


以下答案是不可移植的(它预期负数的两个补码),但它可能正是您所寻找的:

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

E.g。

#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 = %lu\n", UMAX);
    printf("UMIN = %lu\n", UMIN);

    printf("MAX = %li\n", MAX);
    printf("MIN = %li\n", MIN);

    return 0;
}
UMAX = 18446744073709551615
UMIN = 0
MAX = 9223372036854775807
MIN = -9223372036854775808

答案 1 :(得分:0)

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

  • 将所有位设置为一个
  • 按位向上移动所有数据,直到值为零

    不要降档,因为这可能会导致签名延期。

所以喜欢;

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)