负整数的表示

Representation of negative integers

ISO-Prolog 是否有任何处方/建议 关于负整数的表示和对它们的操作?也许是 2 的补码?

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

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

7.1.2 Integer

...

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

此外,9.4 Bitwise functors中列出的可计算函子,即(>>)/2(<<)/2(/\)/2(\/)/2(\)/1xor/2 是为负值定义的实现。例如,

8.4.1 (>>)/2 – bitwise right shift

9.4.1.1 Description

...
The value shall be implementation defined depending on
whether the shift is logical (fill with zeros) or arithmetic
(fill with a copy of the sign bit).

The value shall be implementation defined if VS is negative,
or VS is larger than the bit size of an integer.

请注意,实现定义意味着合规处理器必须在随附文档中对此进行记录。所以在使用符合标准的处理器之前,你必须阅读手册。

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

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

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

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

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

在实践中,幸运的是,似乎对 "The bitwise arithmetic operations behave as if operating on an unlimited length two's complement representation" 达成了共识。