gpt4 book ai didi

c - 毫不费力地想象同一种语言中的两种类型的 bool 对

转载 作者:太空宇宙 更新时间:2023-11-04 00:34:08 25 4
gpt4 key购买 nike

我只是有点理论上的好奇心。 C 中的 == 运算符在正相等的情况下返回 1,否则返回 0。我对 assembly 的了解非常有限。但是,我想知道从理论上讲,是否有可能实现一个新的运算符,在正相等的情况下返回 ~0,否则返回 0——但在一个条件下:< em>它必须产生与 == 运算符 相同数量的汇编指令。这真的只是一种理论上的好奇心,我没有考虑实际用途。

编辑

我的问题针对的是 x86 CPU,但是我非常想知道是否有原生的架构可以做到这一点。

第二次编辑

正如 Sneftel 所指出的,与 SETcc 指令没有任何相似之处 [ 1 ] – 但能够将标志寄存器位转换为 0/~0 值(而不是经典的 0/1) – 存在。所以我的问题的答案似乎是否定的。

第三次编辑

一个小提示。我不是要将逻辑 true 表示为 ~0,我是想了解逻辑 true 是否也可以可选表示为 ~0 在需要时,无需进一步努力,在通常已将 true 表示为 1 的语言中。为此,我假设了一个新的运算符,它“返回”数字,而不是 bool 值(由 ==“返回”的自然逻辑 true 仍然存在表示为 1) – 否则我会问是否可以将 == 重新设计为“返回”~0 而不是 1。您可以将这个新运算符视为一半属于按位运算符家族,它“返回”数字,而不是 bool 值( bool 值我不是指 bool 数据类型,我指的是数字对 之外的任何东西0/1,这是 C 语言中作为逻辑运算结果的 bool 值。

我知道所有这些听起来可能都是徒劳的,但我已经警告过:这是一个理论问题。

但是here我的问题似乎得到了明确的解决:

Some languages represent a logical one as an integer with all bits set. This representation can be obtained by choosing the logically opposite condition for the SETcc instruction, then decrementing the result. For example, to test for overflow, use the SETNO instruction, then decrement the result.

因此似乎没有直接指令,因为使用 SETNE 然后递减意味着再添加一条指令。

最佳答案

编辑:正如其他人指出的那样,一些“有条件地分配 0/1”的风格。有点破坏我的观点 :) 显然,0/1 bool 类型比 0/~0 bool 类型允许更深入的优化。


“运算符返回一个值”的概念是一个高级概念,它不会保留到汇编级别。该 1/0 可能仅作为标志寄存器中的一个位存在,或者甚至不存在。

换句话说,将相等运算符的 C 定义值分配给 int 大小的变量在汇编级别上不是原语。如果您编写 x = (a == b),编译器可能会将其实现为

cmp a, b ; set the Z flag
cmovz x, 1 ; if equals, assign 1
cmovnz x, 0 ; if not equals, assign 0

或者可以通过条件跳转来完成。如您所见,将 ~0 指定为 TRUE 的值将采用相同的命令,只是使用不同的操作数。

我所熟悉的架构都没有将相等比较实现为“将 1 或 0 分配给通用寄存器”。

关于c - 毫不费力地想象同一种语言中的两种类型的 bool 对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55596700/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com