types - 哪些语言将符号/无符号属性归因于操作而不是数据?

标签 types programming-languages unsigned

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

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

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

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

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

最佳答案

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

"Quiz any C developer about unsigned, and pretty soon you discover that almost no C developers actually understand what goes on with unsigned, what unsigned arithmetic is. Things like that made C complex. The language part of Java is, I think, pretty simple. The libraries you have to look up."



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

关于types - 哪些语言将符号/无符号属性归因于操作而不是数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13293774/

相关文章:

language-agnostic - 使用魔术调试值(例如 0xDEADBEEF)作为文字到底有什么危险?

programming-languages - 最小的 LISP?

swift - 将不同类型传递给函数

haskell - Haskell 中的任何类型?

scala - 在 Scala 中引用内部类的类型

从 "USHORT"转换为 'int' 可能会改变它的值

C 以十六进制值初始化数组

java - 如何将 Hibernate String 列转换为 Enum?

programming-languages - 不断变化的框架/API - 我们如何跟上?

c++ - 我不知道如何制作 "const unsigned float&"