-1

我的印象是 INT_MAX 将打开一个 int 的所有 32 位。如果我否定它并将它与自身“和”它,我应该将所有 0 与所有 1 进行比较并返回错误。我错过了什么?

int x = INT_MAX;
x = ~x && INT_MAX;
printf("x = %d\n", x); /*Returns 1*/
x = 0;
x = ~x && INT_MAX;
printf("x = %d\n", x); /*Returns 1*/

编辑:哦,哇,我也在翻转符号位。使用 UNIT_MAX 给了我我需要的结果。谢谢大家!

4

2 回答 2

4

你在这里使用有符号整数;~INT_MAX == INT_MIN编辑:对于二进制补码,这是每个现代处理器使用的),而不是 0。在 C 中,除 0 之外的所有值,包括负数,在条件中使用时都将评估为真。

如果您切换到无符号类型,那么一切都应该按预期工作,因为~UINT_MAX == 0.

于 2018-01-26T21:15:35.357 回答
1

我的印象是 INT_MAX 将打开一个 int 的所有 32 位。

不; 它只会打开int1的低 31 位- 最高(符号)位将保留为 0 以表示正值。 ~INT_MAX对应~0x7FFFFFFF, 或0x80000000.

你在想UINT_MAX


  1. 假设 32 位int;一些实现可能使用更宽的整数。

于 2018-01-26T21:20:38.920 回答