2

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

int isPositive(int x){
    return ~(x >> 31) & 0x1;
}

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

该数字应该适合带有 2 补码的 32 位向量。那么为什么它不起作用呢?

准确地说,我在 Visual Studio 中,它给了我一个编译错误,C4146: unary minus operator applied to unsigned type, result still unsigned但是 -2147483647 似乎有效。

4

2 回答 2

5

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

要么使用INT_MIN,要么使用大多数库用来定义它的技巧:

 isPositive(-2147483647 - 1);
于 2013-09-20T18:48:30.553 回答
0

int由于 C 绝对不保证用于存储数字(符号位或其他)的大小或数值系统,如果您出于任何实际目的尝试这样做,您可能不应该使用与 0 的直接比较最大的便携性。即使将您的类型扩展到更大的类型以“防止”溢出也无济于事,因为 C 对符号位传播等几乎没有保证。

于 2013-09-20T19:10:48.827 回答