【问题标题】:Why does the logical statement !0x00 return 0x01 in C?为什么逻辑语句 !0x00 在 C 中返回 0x01?
【发布时间】:2018-09-25 20:48:24
【问题描述】:

我正在从程序员的角度阅读计算机系统,我正在研究逻辑运算符,它们类似于位运算符,但有一些区别。

我想不通的是,当你有一个逻辑操作数时!0x00 返回 0x01 而不是 0x11?

!是不正确的?所以 NOT 0(false) 应该是 1(true) 而另一个 NOT 0(false) 也应该是 1(true) 对吧?

我看一下位运算符示例:~00,自然会返回 11,但 C 的逻辑运算符似乎有很大的不同。

为什么会这样?

我已经尝试过的:进一步阅读以找到我寻求的答案,它似乎不在这里。

我认为问题在于:可能与十六进制的工作方式有关?但是,十六进制仍然可以有 0x11。 . . .

【问题讨论】:

  • 它被评估为一个布尔值。 0 为假,1 为真。那么!false 必须是true
  • 不要将!(逻辑否定;产生0 [false] 或1 [true])与~(按位否定)混淆。
  • 即使认为 if 语句会将零值视为 false 并将其他任何值视为 true,逻辑运算符如 &&、||、、=、==、! , 和 != 评估为 1 为真,为 0 为假,无论是否传递了某个非真值或其他任何值
  • 为什么会返回 0x11?你的意思是 0xff?
  • 啊,我明白了。零的数量对操作员来说并不重要。把它们想象成十进制的左填充零——0005 仍然只有 5。所以当你给它 0x00 时,它只会看到 0 并返回 1。

标签: c


【解决方案1】:

因为这就是语言的定义方式。 ! 是逻辑 NOT 运算符,C 中的布尔逻辑适用于 10,代表 truefalse

C17 6.5.3.3:

逻辑否定运算符的结果 ! 如果其操作数的值比较,则为 0 不等于 0,如果其操作数的值比较等于 0,则为 1。结果具有类型 诠释。

您可以将其视为返回bool,尽管出于向后兼容性的原因它实际上返回int。与 C++ 不同,它确实返回 bool。关系运算符和相等运算符也是如此。

【讨论】:

  • 那么,它更类似于布尔函数而不是按位运算? 0x00 为假而 0x01 为真?你知道,我曾经讨厌离散结构,但它已成为学习计算原理的宝贵财富。
  • @The_Senate 运算符名称中的“逻辑”部分指的是布尔逻辑。
  • 是的,是的。 . .现在一切都变得如此有意义!谢谢你,伦丁。
【解决方案2】:

表达式!n 等价于(n==0)。如果为真则返回1,如果为假则返回0

【讨论】:

    【解决方案3】:

    !0x00~0x00 都不会给你0x11

    !nn==0 相同,计算结果为 10

    ~n 否定二进制表示的位,而不是您选择输入数字的文字的数字。

    【讨论】:

    • 他们使用速记表示~0x000000... = 0x111111...。请注意,他们也没有指定 0x 部分。
    猜你喜欢
    • 2021-12-15
    • 2017-07-27
    • 1970-01-01
    • 2019-10-30
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多