【问题标题】:What languages attribute sign/unsignedness to the operation not the data?哪些语言将符号/无符号归因于操作而不是数据?
【发布时间】:2012-10-28 22:17:35
【问题描述】:

在大多数比汇编更高级的语言中,整数变量具有带符号或无符号的特性。在 C 中,“无符号短”作为数据类型。我能想到的所有语言,C 系列或 Pascal 派生的新语言,如 Go,都有这样的数据类型。 (有些不提供未签名,只是签名,但没关系。)

基本事实是,我研究过的所有 CPU 都具有与操作相关的符号,或者在操作之后选择分支操作码。有有符号右移和无符号右移操作码。有符号和无符号整数都经过相同的算术电路,因为 1 和 0 的结果相同。进位和溢出标志得到调整。当编译器根据符号表和它建立的变量属性选择进位分支与溢出分支或类似选择时,就会出现区别。

只是好奇,因为我喜欢接近硅的语言 - 是否有任何更高级别的语言,比如在 C 级别以上,整数值不使用任何有符号/无符号属性键入?

我知道 Java 中的 >>> 运算符。这是我所要求的一个小例子,但想知道是否有语言(可能是晦涩难懂的)彻底使用不同的运算符而不是有符号/无符号的不同数据类型。

(有点相关的问题是任何语言是否提供对 CPU 的 C 或 O 标志的访问,因此您可以 DIY。)

【问题讨论】:

  • 听说过很多语言,但没有听说过。仍然喜欢这个问题,因为我曾经想过完全一样。
  • cpu 可能会将符号与运算符相关联,但这不是程序员的正确抽象。签名是数据类型的一种质量。至少在它们的域不等价的意义上,底层表示是不同的。将符号保留移位用作高级语言中的运算符似乎很方便,它的使用仍然存在争议 - 符号保留右移是除以 2,这可能更好地反映了应用程序中的算法步骤领域。如果代码实际上是在处理问题域中的位集...
  • ...它应该通过使用/定义可能带有自己的一组合适的运算符的合适的数据类型来表达。编译器可以将此数据类型映射到 cpu/vm 本机支持的最合适的数据类型,同时考虑到应用于数据和性能标准的高级操作(在示例中,映射很容易并且不需要任何显着性能损失)。

标签: types programming-languages unsigned


【解决方案1】:

我认为从语言开发人员的角度来看,无符号和有符号操作是相当罕见的。具有无符号右移行为的 java 运算符 >>> 似乎是一个例外,它的用法与将其操作数视为有符号或无符号(我的假设)没有太大关系。 如果您将所有有符号/无符号逻辑实现为操作,它很快就会变得棘手。例如考虑两个 C 赋值:

short var_a = -1;
unsigned int var_b = var_a;
printf("%d", var_b); // -1

unsigned short var_a = -1;
unsigned int var_b = var_a;
printf("%d", var_b); // 65535

第一种情况必须执行符号扩展,因为它是有符号类型的向上转换,而第二种情况不能执行符号扩展,因为它是无符号类型的向上转换。我不想考虑为此类分配使用哪种分配操作。

也可以考虑Gosling's opinion

“向任何 C 开发人员询问关于 unsigned 的问题,很快你就会发现 几乎没有 C 开发人员真正了解发生了什么 无符号,什么是无符号算术。这样的事情使 C 复杂的。我认为 Java 的语言部分非常简单。这 您必须查找的库。”

我同意他的观点,并认为拥有一种签名类型更简单。需要 Java 等语言中的无符号算术的人可以轻松地自己实现它(我在 Java 中实现了一个 C 解释器)。

【讨论】:

    猜你喜欢
    • 2012-01-19
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    • 2020-10-30
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多