当前位置: 首页 > 知识库问答 >
问题:

哪些算术运算在无符号和二进制补码有符号数字上是相同的?

微生毅
2023-03-14

我正在设计一个简单的玩具指令集和附带的仿真器,并试图找出支持什么指令。在算术方面,我目前有无符号加法、减法、乘法和除法。然而,对于以下问题,我似乎找不到一个明确的答案:哪种算术运算符需要有符号版本,而无符号和二的补码有符号版本对哪一种是等价的?

例如,1111在2的补码中等于-1。如果你给它加1,假装它是一个无符号的数字,你会得到0000,即使把它想象成-1也是正确的。然而,这适用于所有数字吗?其他三个操作(减法、乘法、除法)呢?

共有3个答案

谷梁建中
2023-03-14

您的所有操作都需要溢出检查,否则在某些情况下它们会返回不正确的值。这些检查的未签名版本与签名版本不同,因此您需要分别实现每个例程。

李宜然
2023-03-14

加法和减法对于有符号和无符号2补码是相同的,假设您要以大多数CPU的正常方式处理上溢/下溢,即只需回绕。乘法和除法是不同的。所以不管有无符号,你只需要一个加法例程和一个减法例程,但是你需要分开的有符号和无符号乘和除。

诸葛砚文
2023-03-14

加法、减法和乘法相同:

  1. 您的输入和输出大小相同
  2. 溢出时的行为是模2n

组织不一样。

许多指令集提供输出大于输入的乘法运算,同样,有符号和无符号的乘法运算是不同的。

此外,如果您正在用C编写仿真器,则需要注意该语言的一些错误特性。

  1. C中有符号算术的溢出是未定义的行为。为了获得可靠的模2n行为,必须使用无符号类型执行算术运算
  2. C会将小于int的类型升级为int。需要非常小心地避免此类升级(在计算开始时添加0u或乘以1u是一种方法
  3. 从无符号类型到有符号类型的转换是由实现定义的,我见过的实现做了明智的事情,但可能有一些没有
 类似资料:
  • 我在看的书:CS-app 2。c有无符号和有符号的int类型,并且在大多数架构中使用二进制补码算法来实现有符号值;但是学了一些汇编代码之后,发现很少有指令区分无符号和有符号。所以我的问题是: > 区分有符号和无符号是编译器的责任吗?如果是,它是如何做到的? 谁实现两个补码算法——CPU还是编译器? 添加更多信息: 在学习了更多的指令后,实际上有一些指令区分有符号和无符号,例如setg、seta等。

  • C语言有符号和无符号类型,如char和int。我不确定它是如何在程序集级别实现的,例如,在我看来,有符号和无符号的乘法会带来不同的结果,那么程序集是同时做无符号和有符号的算术,还是只做一个,这在某种程度上是针对不同情况模拟的?

  • 我正在使用MASM 14.0进行组装,我与下面代码的输出混淆。 这两个算术运算都是在无符号整数255和127上完成的。 然而,CPU将第一个操作255视为无符号整数,并设置进位标志,当将1添加到无符号255时会出现这种情况。 完整的状态标志是CF=1 SF=0 ZF=1 OF=0 AF=1 PF=1,eax为0 但是,第二个操作在设置溢出标志时将127视为有符号整数,如果将127加1,则会发生溢出

  • 有符号和无符号变量在按位运算上有区别吗?< br >例如,在处理无符号数字时:< br> 将得到00000101。 但当处理带符号的数字时会发生什么?

  • 问题内容: 我有一个二进制字符串,如下所示: 我希望我的INT的值是代替 实现此目标的最佳方法是什么? 问题答案: 使用Where 是您的方案无法表示的最小正数。(在这种情况下为8,因为为7且为负。) 大于,所以你减去的,给。

  • 本文向大家介绍C语言中无符号数和有符号数之间的运算,包括了C语言中无符号数和有符号数之间的运算的使用技巧和注意事项,需要的朋友参考一下 C语言中有符号数和无符号数进行运算(包括逻辑运算和算术运算)默认会将有符号数看成无符号数进行运算,其中算术运算默认返回无符号数,逻辑运算当然是返回0或1了。 unsigned int和int进行运算 直接看例子来说明问题吧 输出结果为: 这是因为a和b进行比较的时