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

zil*_*n01 12 boolean language-design internal-representation

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

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

cas*_*One 29

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

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


Ada*_*vis 22

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

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

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

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

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

-亚当


mou*_*iel 11

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

  • 在内部,他们必须最终成为1,0或者其他......我想不出任何可以代表真/假的处理器而不诉诸至少一个二进制标志.:-) (2认同)
  • 根据我的经验,隐式转换几乎总是导致难以理解的复杂代码段.即使是明确的转换也可能导致问题.True为TRUE,false为FALSE.这些布尔值不是数字. (2认同)
  • 是的,但是根据语言的目的,坚持这个或泄漏这个抽象可能是错误的选择. (2认同)

tva*_*son 11

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

  0xffffffff & 0x00000010 == 0x00000010 (true)
  0xffffffff && 0x00000010 == 0xffffffff (true)
Run Code Online (Sandbox Code Playgroud)

  0x00000001 & 0x00000010 == 0x00000000 (false)
  0x00000001 && 0x00000010 == 0xffffffff (true)
Run Code Online (Sandbox Code Playgroud)

  • 有人会争辩说,在存在编程错误的情况下,它继续以一种不太可预测的方式工作,这不是卖点. (4认同)

Var*_*han 5

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

  • 某些操作溢出的迹象

要么

  • 错误标记

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