如何在C中仅使用按位运算符获取INT_MAX
的值?我希望~0
为1111111111
(1
的补码,所以十进制-1
)和~0 >> 1
为0111111111
,这将是最大值,但它仍然是-1
。
为什么会这样,如何通过使用位操作来获取INT_MAX
的值?
答案 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;