通过位操作获取INT_MAX

时间:2012-02-22 20:25:14

标签: c bitwise-operators

如何在C中仅使用按位运算符获取INT_MAX的值?我希望~011111111111的补码,所以十进制-1)和~0 >> 10111111111,这将是最大值,但它仍然是-1

为什么会这样,如何通过使用位操作来获取INT_MAX的值?

8 个答案:

答案 0 :(得分:10)

试试~0UL >> 1。问题是,如果C处理签名类型,C将执行符号扩展右移。这就是为什么你仍然会得到负面的原因 - 因为它在另外1位移位以匹配那里的1位。 (那样-8>> 1就像你想要快速划分两个-4一样。)

答案 1 :(得分:2)

如果向右移动一个负数,则该数字的新位可能为1(保持为负数)。这就是为什么你得到-1。

编辑:您可以执行以下操作:

int i=1;
while (i<<1) i<<=1;
i=~i;

答案 2 :(得分:2)

如果将0视为无符号整数,编译器将不会执行有符号的移位:

int i = ~0U >> 1;

这将为您提供INT_MAX

答案 3 :(得分:1)

据我所知,除了使用INT_MAX宏之外,没有可移植的解决方案。看到我长期存在的问题:

Programmatically determining max value of a signed integer type

以及它基于的问题:

C question: off_t (and other signed integer types) minimum and maximum values

答案 4 :(得分:1)

(1 <&lt; 31)-1)

也是。这是一个老线程,但我会发布它任何人用Google搜索它。但它并非完全按位,而且假设您的机器上的“int”是32位。

答案 5 :(得分:0)

#include <stdio.h>

int main(){
    int max = ~0U >> 1;
    int min = ~max;

    printf("Max = 0x%X, min = 0x%X", max, min);
    return 0;
}

输出:

Max = 0x7FFFFFFF, min = 0x80000000

答案 6 :(得分:0)

在这里,您可以找到任何带符号整数类型的MIN / MAX。但是,我认为左移会进行算术移位并用零填充空白,这对于大多数编译器都是正确的。

#define MIN_OF_SIGNED_TYPE(type) ((type)1 << (sizeof(type) * 8 - 1))
#define MAX_OF_SIGNED_TYPE(type) (~MIN_OF_SIGNED_TYPE(type))

#define MY_INT_MIN MIN_OF_SIGNED_TYPE(int)
#define MY_INT_MAX MAX_OF_SIGNED_TYPE(int)

答案 7 :(得分:-1)

int int_max = (unsigned int)-1 >> 1;