4

ISO-Prolog 是否对负整数的表示及其操作有任何规定/建议?2的补码,也许吧?

作为程序员/用户提问:在对负整数执行位级运算时,我可以安全地做出任何假设吗?

4

2 回答 2

4

ISO/IEC 13211-1 对整数有几个要求,但不需要具体的表示。如果整数表示是有界的,则以下条件之一成立

7.1.2 整数

...

minint = -(*minint)
minint = -(maxint+1)

此外, 9.4 位仿函数中列出的可评估仿函数,即(>>)/2(<<)/2(/\)/2(\/)/2(\)/1xor/2是为负值定义的实现。例如,

8.4.1 (>>)/2 – 按位右移

9.4.1.1 说明

...
该值应根据
移位是逻辑(用零填充)还是算术
(用符号位的副本填充)来定义。如果为负数或大于整数的位大小,

则该值应由实现定义。VS
VS

请注意,定义的实现意味着符合标准的处理器必须在随附的文档中记录这一点。因此,在使用符合标准的处理器之前,您必须阅读手册。

事实上,没有当前的 Prolog 处理器(我知道)不提供算术右移并且不使用2's 补码

于 2015-05-13T11:10:01.777 回答
0

严格来说,这是两个不同的问题:

  1. 实际物理表示:这在 Prolog 级别是不可见的,因此标准完全正确地对此无话可说。请注意,许多 Prolog 系统具有两个或多个内部表示(例如,二进制补码固定大小和符号+大小 bignums),但向程序员提供单个整数类型。

  2. 按位操作的结果:虽然标准定义了这些操作,但它保留了它们的大部分行为实现定义。这是因为 (a) 没有办法指定位模式的宽度,以及 (b) 没有承诺负数和位模式之间的特定映射。

这不仅意味着对负数的所有按位运算在官方上是不可移植的,而且还有一个奇怪的效果,即按位否定的结果完全是实现定义的(即使对于正参数): Y is \1可以合法地给出 -2、268435454、2147483646、 9223372036854775806 等。你所知道的是,否定两次返回原始数字。

幸运的是,在实践中,似乎对“按位算术运算表现得好像在无限长度的二进制补码表示上进行运算”达成了共识。

于 2015-05-15T18:41:37.110 回答