ISO-Prolog是否有任何处方/建议 关于负整数的表示和对它们的操作?也许是2的补充?
作为程序员/用户问:在对负整数执行位级操作时,我可以安全地做出任何假设吗?
答案 0 :(得分:3)
ISO / IEC 13211-1对整数有几个要求,但不要求具体表示。如果整数表示有界,则满足以下条件之一
7.1.2整数
...
minint = - (* minint)
minint = - (maxint + 1)
此外,9.4 Bitwise functors中列出的可评估仿函数为w00t
,(>>)/2
,(<<)/2
,(/\)/2
,(\/)/2
和{ {1}}是为负值定义的实现。如,
8.4.1(&gt;&gt;)/ 2 - 按位右移
9.4.1.1说明
...
该值应根据是否合乎逻辑(用零填充)或算术
(填写符号位的副本)来定义实施。
该值应为如果(\)/1
为负数,则为实现定义,
或xor/2
大于整数的位大小。
请注意,定义的实现意味着符合标准的处理器必须在随附的文档中对此进行记录。因此,在使用符合标准的处理器之前,您必须阅读手册。
事实上,目前没有Prolog处理器(我知道)不提供算术右移并且不使用2's complement。
答案 1 :(得分:0)
严格来说,这是两个不同的问题:
实际的物理表示:这在Prolog级别是不可见的,因此标准对此没有任何意义。请注意,许多Prolog系统具有两个或更多内部表示(例如,两个补码固定大小和符号+幅度bignums),但向程序员提供单个整数类型。
按位运算的结果:虽然标准定义了这些操作,但它的大部分行为实现已定义。这是(a)没有办法指定位模式的宽度,以及(b)不承诺负数和位模式之间的特定映射的结果。
这不仅意味着对负数的所有按位运算都是正式不可移植的,而且还具有奇怪的效果,即按位否定的结果完全实现定义(即使对于正参数): Y is \1
可合法地给出-2,268435454,2147483646,9223372036854775806等。你所知道的是,否定两次会返回原始数字。
实际上,幸运的是,似乎已经就"The bitwise arithmetic operations behave as if operating on an unlimited length two's complement representation"达成了共识。