13

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

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

4

11 回答 11

29

没关系,只要满足对外表示的规则即可。

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

于 2009-04-07T19:17:03.227 回答
22

0 为假,因为处理器具有在寄存器设置为零时设置的标志。

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

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

如果你想为 true “定义”一个默认值,那么 0x01 比大多数都好:

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

-亚当

于 2009-04-07T20:23:55.310 回答
11

你为什么选择非零值是真的?在 Ada 中,真为真,假为假。与 BOOLEAN 之间没有隐式类型转换。

于 2009-04-07T19:23:19.980 回答
11

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

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

  0x00000001 & 0x00000010 == 0x00000000 (false)
  0x00000001 && 0x00000010 == 0xffffffff (true)
于 2009-04-07T19:33:04.060 回答
5

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

  • 某些操作溢出的迹象

或者

  • 错误标记

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

于 2009-04-07T19:18:45.920 回答
4

-1 比 1 长...

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

编辑,对于那些不赞成投票的人,请解释原因。这个答案与当前评分为 +19 的​​答案基本相同。因此,对于相同的基本答案,这是 21 票的差异。

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

如果你要标记一些东西,至少要提供一个理由。

于 2009-04-07T19:19:24.763 回答
3

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

也许您想通过考虑布尔运算符是否产生仅是一个 0 或 1 位(无论符号扩展如何工作)或全零或全一(并且取决于有符号二进制补码的符号扩展)来重新表述量以保持任何长度的全1)。

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

于 2009-04-07T19:21:51.683 回答
3

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

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

于 2009-04-07T20:29:15.377 回答
2

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

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

于 2009-04-07T19:27:23.480 回答
1

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

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

于 2009-04-07T19:47:15.167 回答
1

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

于 2009-04-07T20:33:27.287 回答