负整数的表示
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
、(\)/1
、 xor/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。
严格来说,这是两个不同的问题:
实际的物理表示:这在 Prolog 级别是不可见的,因此该标准完全正确地对此无话可说。请注意,许多 Prolog 系统有两个或多个内部表示(例如二进制补码固定大小和符号+大小大数)但向程序员提供单个整数类型。
按位运算的结果:虽然标准定义了这些运算,但它保留了它们的大部分行为实现定义。这是 (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" 达成了共识。
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
、(\)/1
、 xor/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 ifVS
is negative,
orVS
is larger than the bit size of an integer.
请注意,实现定义意味着合规处理器必须在随附文档中对此进行记录。所以在使用符合标准的处理器之前,你必须阅读手册。
事实上,目前没有 Prolog 处理器(我知道)不提供算术右移并且不使用 2's complement。
严格来说,这是两个不同的问题:
实际的物理表示:这在 Prolog 级别是不可见的,因此该标准完全正确地对此无话可说。请注意,许多 Prolog 系统有两个或多个内部表示(例如二进制补码固定大小和符号+大小大数)但向程序员提供单个整数类型。
按位运算的结果:虽然标准定义了这些运算,但它保留了它们的大部分行为实现定义。这是 (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" 达成了共识。