代码之家  ›  专栏  ›  技术社区  ›  zildjohn01

布尔真-正1还是负1?

  •  11
  • zildjohn01  · 技术社区  · 15 年前

    我正在设计一种语言,并试图决定 true 应为0x01或0xFF。显然,所有非零值都将转换为true,但我正在尝试确定确切的内部表示。

    每个选择的优缺点是什么?

    11 回复  |  直到 12 年前
        1
  •  21
  •   Adam Davis    15 年前

    0为假,因为当寄存器设置为零时,处理器有一个标志。

    在任何其他值(0x01、0xFF等)上都不会设置其他标志,但当寄存器中存在非零值时,零标志设置为假。

    因此,这里提倡将0定义为假,而其他任何定义为真的答案都是正确的。

    如果要将默认值“定义”为“真”,则0x01优于大多数:

    • 它在每个位长度和签名中表示相同的数字
    • 如果你想知道它是真的,零标志是否不可用,或者使用成本高,只需要测试一位。
    • 在转换为其他类型期间无需担心符号扩展
    • 逻辑表达式和算术表达式对它的作用相同

    -亚当

        2
  •  29
  •   casperOne    15 年前

    只要它满足外部表示的规则,就没关系。

    这里我会从C中得到一个提示,其中false绝对定义为0,true定义为非false。这是一个重要的区别,当与真的绝对值比较时。除非您的类型只有两种状态,否则必须考虑该值类型中的所有值,什么是真的,什么是假的。

        3
  •  11
  •   mouviciel    15 年前

    为什么选择非零值为真?在《阿达》中,真是真,假是假。不存在与布尔值之间的隐式类型转换。

        4
  •  11
  •   tvanfosson    15 年前

    在弱类型语言中,使用-1有一个优点——如果您搞砸了并使用位 and 运算符而不是逻辑运算符 运算符,只要其中一个操作数已转换为标准布尔表示,则条件的计算仍将正确。如果规范表示为1,则不是这样。

      0xffffffff & 0x00000010 == 0x00000010 (true)
      0xffffffff && 0x00000010 == 0xffffffff (true)
    

    但是

      0x00000001 & 0x00000010 == 0x00000000 (false)
      0x00000001 && 0x00000010 == 0xffffffff (true)
    
        5
  •  5
  •   Varkhan    15 年前

    如果你想坚持下去 =0x00,应使用0x01。0xFF通常是:

    • 某些操作溢出的迹象

    • 错误标记

    在这两种情况下,这可能意味着 . 因此,*nix从可执行文件返回值约定,即 =0x00,任何非零值为假。

        6
  •  4
  •   TofuBeer    12 年前

    -1的键入长度大于1…

    归根结底,这并不重要,因为0是假的,其他任何东西都是真的,并且您永远不会将其与真实的精确表示进行比较。

    编辑,对于那些投票失败的人,请解释原因。这个答案基本上与当前评分为+19的答案相同。所以这是21票的差额,对于什么是相同的基本答案。

    如果是因为-1注释,这是真的,那么实际定义“真”(例如编译器编写器)的人将不得不使用-1而不是1,假设他们选择使用精确的表示。-1的输入时间将比1长,最终结果将相同。这句话很愚蠢,本来是想说很愚蠢,因为这两者之间没有真正的区别(1或-1)。

    如果你要把某件事记下来,至少要提供一个理由。

        7
  •  3
  •   Liudvikas Bukys    15 年前

    0xFF是一个奇怪的选择,因为它有一个隐含的假设,即8位是您的最小存储单元。但是,想要更紧凑地存储布尔值并不少见。

    也许您想通过思考布尔运算符是否只生成一个0或1位(不管符号扩展如何工作),还是全部为零或全部为零(并且取决于有符号二的补数量的符号扩展来保持任何长度的全部为零)来重新表述。

    我觉得0和1会让你的生活更简单。

        8
  •  3
  •   Daniel Daranas    15 年前

    优点不在,缺点也不在。只要您提供从整数到布尔值的自动转换,它将是任意的,所以您选择的数字并不重要。

    另一方面,如果您不允许这种自动转换,那么您将拥有一个pro:您的语言中不会有完全任意的规则。你不会的 (7 - 4 - 3) == false 3 * 4 + 17 == "Hello" "Hi mom!" == Complex(7, -2) .

        9
  •  2
  •   kenj0418    15 年前

    我认为C方法是可行的。0表示假,其他表示真。如果您使用另一个true映射,那么您将面临具有不确定值的问题——既不是true也不是false。

    如果这是您将为特定的指令集编译的语言,该指令集对特定的表示有特殊的支持,那么我将让它指导您。但如果没有任何附加信息,对于“标准”内部表示,我将使用-1(所有1都是二进制的)。这个值可以很好地扩展到您想要的任何大小的布尔值(单位、8位、16位等),如果您将“真”或“假”分解为较小的“真”或“假”,它仍然是相同的。(如果你打破了16位真=0x001,你会得到一个假=0x00和一个真=0x01)。

        10
  •  1
  •   dwc    15 年前

    设计语言,使0为假,非零为真。不需要“转换”任何东西,并且认为“非零”而不是某些特定的值将帮助您正确地编写代码。

    如果您有像“真”这样的内置符号,那么继续选择一个值,但始终认为“非零为真”而不是“0x01为真”。

        11
  •  1
  •   anon    15 年前

    无论你做什么,一旦你选择了你的值,就不会改变它们。在forth-77中,正确和错误分别定义为1和0。然后,forth-83将它们重新定义为-1和0。由此引起的问题不多(好吧,只有几个,这是我们正在讨论的第四个问题)。

    推荐文章