【问题标题】:(~INT_MAX && INT_MAX) returns 1?(~INT_MAX && INT_MAX) 返回 1?
【发布时间】:2018-01-26 21:11:12
【问题描述】:

我的印象是 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 给了我我需要的结果。谢谢大家!

【问题讨论】:

  • 我的印象是 INT_MAX 会打开 int 的所有 32 位。 - 你忘了符号位。
  • &&逻辑 AND,而不是bit-wise
  • “我的印象是 INT_MAX 将打开一个 int 的所有 32 位。”你有错误的印象。有符号值使用 MSb 表示负值。

标签: c expression numeric-limits


【解决方案1】:

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

如果您切换到无符号类型,自 ~UINT_MAX == 0 以来,一切都应按预期工作。

【讨论】:

  • ~INT_MAX == INT_MIN - 我认为这是不正确的......更新:嗯,正确的 2 的补码。
  • @ChristianGibbons 快速搜索一下:superuser.com/questions/1137182/… 无论如何,在大多数情况下都是这样,这很好。
  • @EugeneSh。不要误会我的意思,我在你身边。 C 标准不保证~INT_MAX == INT_MIN。这些天不会找到许多处理器不是真的,但了解这种可能性总是好的。而且我在这里和那里都喜欢学究气。
  • 我实际上认为这个问题的真正答案是 OP 使用的是&& 而不是&...但是...好的:)
  • 嗯,我不认为所以因为OP在问题中说“我应该将所有0与所有1进行比较并返回false”,但这绝对有可能......
【解决方案2】:

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

没有;它只会打开int1 的低 31 位 - 最高(符号)位将保留为 0 以表示正值。 ~INT_MAX 对应于 ~0x7FFFFFFF0x80000000

您正在考虑UINT_MAX


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多