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