使用按位运算检查int是正还是负的函数

Kri*_*son 2 c 32-bit bit-manipulation

我正在尝试编写一个C函数来检查a int是否为正.这就是我所拥有的:

int isPositive(int x){
    return ~(x >> 31) & 0x1;
}
Run Code Online (Sandbox Code Playgroud)

根据数字,这应该返回1是正数而0不是.它适用于所有数字,但不适用于 -2147483648.

该数字应该适合具有2的补码的32位向量.那为什么不工作呢?

确切地说,我在Visual Studio中,它给了我一个编译错误,C4146: unary minus operator applied to unsigned type, result still unsigned但-2147483647似乎工作.

Car*_*rum 5

你是怎么进入的-2147483648?如果你只是输入,直接到你的程序,这将是一元-适用于文字,不是文字,包括-.由于2147483648不适合int,因此您的文字会获得unsigned类型.

使用INT_MIN或使用大多数库用来定义它的技巧:

 isPositive(-2147483647 - 1);
Run Code Online (Sandbox Code Playgroud)