4

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

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

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

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

(有点相关的是任何语言是否提供访问 CPU 的 C 或 O 标志的问题,所以你可以自己动手做。)

4

1 回答 1

0

我认为从语言开发人员的角度来看,没有签名和签名的操作是相当罕见的。具有无符号右移行为的 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对此的看法:

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

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

于 2014-02-03T18:15:29.490 回答