布尔值为true - 正1还是负1?

时间:2009-04-07 19:13:00

标签: boolean language-design internal-representation

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

每种选择的利弊是什么?

11 个答案:

答案 0 :(得分:29)

无关紧要,只要它满足外部表示的规则。

我会在这里接受C的提示,其中false绝对定义为0,而true定义为非假。与真实的绝对值相比,这是一个重要的区别。除非您的类型只有两种状态,否则您必须考虑该值类型中的所有值,什么是真,哪些是错误。

答案 1 :(得分:22)

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

没有其他标志设置在任何其他值(0x01,0xff等)上 - 但当寄存器中存在非零值时,零标志设置为false。

所以这里的答案主张将0定义为false,其他任何内容都是正确的。

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

  • 它表示每个位长度和签名中的相同数字
  • 如果您想知道它是否属实,零标志是否不可用或使用成本高昂,则只需要测试一位
  • 转换为其他类型时无需担心签名扩展
  • 逻辑和算术表达式在其上的行为相同

- 亚当

答案 2 :(得分:11)

为什么选择非零值为真?在Ada中,true为TRUE,false为FALSE。 BOOLEAN没有隐式类型转换。

答案 3 :(得分:11)

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

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

  0x00000001 & 0x00000010 == 0x00000000 (false)
  0x00000001 && 0x00000010 == 0xffffffff (true)

答案 4 :(得分:5)

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

  • 某些操作溢出的迹象

  • 错误标记

在这两种情况下,它可能意味着 false 。因此,来自可执行文件的* nix返回值约定, true = 0x00,并且任何非零值都是false。

答案 5 :(得分:4)

-1比#1更长的类型

最后它没关系,因为0是假的,其他任何事情都是真的,你永远不会与真实的确切表示进行比较。

编辑,对于那些投票,请解释原因。这个答案基本上与目前评级为+19的答案相同。所以这是相同的基本答案的21票差异。

如果是因为-1注释,确实如此,实际定义“true”的人(例如:编译器编写者)将不得不使用-1而不是1,假设他们选择使用确切的表示。 -1输入的时间比1要长,最终结果是相同的。声明是愚蠢的,它本来是愚蠢的,因为两者之间没有真正的区别(1或-1)。

如果你想要标记某些内容,至少要为它提供理由。

答案 6 :(得分:3)

0xff是一个奇怪的选择,因为它隐含假设8位是你的最小存储单元。但是,想要比这更紧凑地存储布尔值并不常见。

也许你想通过考虑布尔运算符是否只产生一个0或1位(无论符号扩展是否有效),或者是全零或全1(并且取决于签名的符号扩展)来改写二维补数,以任意长度维持所有 - )。

我认为你的生活更简单,0和1。

答案 7 :(得分:3)

优点是没有,缺点也是没有。只要你提供从整数到布尔值的自动转换,它就是任意的,所以你选择哪个数字并不重要。

另一方面,如果你不允许这种自动转换,你就会有一个专家:你的语言不会有任何完全随意的规则。您不会有(7 - 4 - 3) == false3 * 4 + 17 == "Hello""Hi mom!" == Complex(7, -2)

答案 8 :(得分:2)

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

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

答案 9 :(得分:1)

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

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

答案 10 :(得分:1)

无论你做什么,一旦你选择了你的价值观,就不要改变它们。在FORTH-77中,true和false被定义为1和0.然后,FORTH-83将它们重新定义为-1和0.有一些(很好,只有少数,这是我们正在讨论的问题)问题由此引起的。