我正在设计一种编程语言,正在尝试决定true
应该是0x01还是0xFF。显然,所有非零值都将转换为true,但我正在努力确定精确的内部表示方式。
对于每个选择,有哪些优缺点?
我正在设计一种编程语言,正在尝试决定true
应该是0x01还是0xFF。显然,所有非零值都将转换为true,但我正在努力确定精确的内部表示方式。
对于每个选择,有哪些优缺点?
只要满足外部表示的规则,就无关紧要。
在这里我会借鉴C语言的做法,其中false被绝对定义为0,而true被定义为非false。这是一个重要的区别,与true的绝对值相比。除非你有一种仅有两个状态的类型,否则你必须考虑该值类型中的所有值,什么是true,什么是false。
在弱类型语言中,使用 -1 有一个优点——如果您搞错了并使用按位 and
运算符而不是逻辑 and
运算符,只要其中一个操作数已被转换为规范的布尔表示形式,您的条件仍将正确计算。 如果规范表示为 1,则情况并非如此。
0xffffffff & 0x00000010 == 0x00000010 (true)
0xffffffff && 0x00000010 == 0xffffffff (true)
但是
0x00000001 & 0x00000010 == 0x00000000 (false)
0x00000001 && 0x00000010 == 0xffffffff (true)
为什么你选择非零值为真?在Ada中,真是TRUE,假是FALSE。没有从BOOLEAN进行隐式类型转换。
在我看来,如果你想坚持使用false=0x00,你应该使用0x01。0xFF通常表示:
或者
在这两种情况下,它很可能意味着false。因此,在*nix可执行文件的返回值约定中,true=0x00,任何非零值都是false。
-1比1更长,但最终并不重要,因为0是false,任何其他值都是true,并且你永远不会与true的确切表示进行比较。
请注意,对于那些给出负评的人,请说明原因。这个答案本质上与当前评分为+19的答案相同。所以这是21票的差异,而它们是基本相同的答案。
如果是因为-1的评论,那么是真的,实际定义“true”的人(例如:编译器编写者)将不得不使用-1而不是1,假设他们选择使用精确表示。 -1打字时间会比1长,最终结果将是相同的。这个声明很傻,它是为了好玩而发表的,因为两者之间没有真正的区别(1或-1)。
如果您要标记某些内容,请至少提供一个理由。
0xff是一个奇怪的选择,因为它有一个隐含的假设,即8位是您的最小存储单元。但是,想要比这更紧凑地存储布尔值并不那么罕见。
也许您可以通过考虑布尔运算符是否产生仅为1个0或1个位(这适用于任何符号扩展),或者全部为零或全部为1(并取决于带符号二进制补码量的符号扩展以在任何长度上保持全部1)来重新表述。
我认为使用0和1会使您的生活更简单。
我认为C方法是最好的选择。0表示假,其他任何值都表示真。如果你选择另一种映射来表示真,那么你就会面临一个问题,即存在不确定的值,既不是真也不是假。
如果你将要编译的语言针对特定指令集具有特殊支持,则应该让这个指导你。但是在没有任何额外信息的情况下,对于“标准”内部表示,我会选择-1(二进制中的所有1)。这个值可以很好地扩展到你想要的任何大小的布尔值(单个位、8位、16位等),如果你将“TRUE”或“FALSE”分解成较小的“TRUE”或“FALSE”,它仍然是相同的。(如果你将一个16位的TRUE=0x0001分解开,你将得到一个FALSE=0x00和一个TRUE=0x01)。