标签: twos-complement

使用 2 的补码对有符号数进行二进制除法

首先,这不是一个重复的问题,因为它没有回答我下面的问题。

我搜索了许多资源,但最终没有清楚地了解如何使用 2 的补码执行有符号数除法,特别是对于除数或被除数之一或两者都为负数的情况。

我阅读了弗洛伊德的《数字基础知识》第二章中的有符号数除法部分及其所有示例和问题。我什至阅读了解释除法的互联网资源,但他们只使用正数(如下所述):

在此输入图像描述

在此输入图像描述 在此输入图像描述

,但是 100/-25 或 -100/25 或 -100/-25 呢?要遵循什么规则?

谁能给出一个简单的解释,例如如何将 14 除以 -7?

binary division digital-logic twos-complement

6
推荐指数
1
解决办法
2万
查看次数

浮点单调性质

我正在读一本书.在书中写道 -

浮点加法满足以下单调特性:
如果a>=b(x + a) >= (x+b)对任何价值a,bx其他比NaN.无符号或二进制补码的加法不符合实数(和整数)加法的这一性质.

浮点如何服从它?
为什么无符号或两个补码不符合它?

c floating-point twos-complement unsigned-integer real-number

6
推荐指数
1
解决办法
243
查看次数

sra(右移算术)与 srl(逻辑右移)

请看一下这两段伪汇编代码:

1)

li $t0,53

sll $t1,$t0,2
srl $t2,$t0,2
sra $t3,$t0,2

print $t1  
print $t2  
print $t3  
Run Code Online (Sandbox Code Playgroud)

2)

li $t0,-53


sll $t1,$t0,2
srl $t2,$t0,2
sra $t3,$t0,2

print $t1
print $t2
print $t3
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,输出为:
212
13
13

后者是:
-212
107374...
-14
但不应该:sra (-53) = - (srl 53) ?

assembly mips bit-shift twos-complement

5
推荐指数
1
解决办法
4万
查看次数

以二进制补码表示读/写Haskell Integer

我需要以与Java对BigInteger类所做的兼容的方式读写Integers :

返回一个包含此BigInteger的二进制补码表示的字节数组.字节数组将采用big-endian字节顺序:最重要的字节位于第0个元素中.该数组将包含表示此BigInteger所需的最小字节数,包括至少一个符号位,即(ceil((this.bitLength()+ 1)/ 8)).

可悲的是,这排除了Data.Binary提供什么.在库中的某个地方遵循此约定,是否有效地进行ByteString< - > Integer转换?如果没有,怎么办呢?

基于Thomas M. DuBuisson(以及以下讨论)的回答,我现在有了

i2bs :: Integer -> B.ByteString
i2bs x
   | x == 0 = B.singleton 0
   | x < 0 = i2bs $ 2 ^ (8 * bytes) + x
   | otherwise = B.reverse $ B.unfoldr go x
   where
      bytes = (integerLogBase 2 (abs x) + 1) `quot` 8 + 1
      go i = if i == 0 then Nothing
                       else Just (fromIntegral …
Run Code Online (Sandbox Code Playgroud)

binary haskell integer twos-complement

5
推荐指数
1
解决办法
1036
查看次数

补码的劣势?

我正在阅读有关二进制补码的内容,我知道这种方法最有效,但也可能存在一些缺点。我找不到任何缺点,是否存在转换为二进制补码无法正确表示数字的情况?

twos-complement

5
推荐指数
1
解决办法
4395
查看次数

为什么java方法Integer.toBinaryString(-128)输出七位数?

简单的场景:你有一个字节数组

byte[] message = { 1, 2, 3 };

要以二进制打印出来,您可以使用以下代码:

for (byte b : message) {
    System.out.println(Integer.toBinaryString(0x100 + b).substring(1));
}
Run Code Online (Sandbox Code Playgroud)

(从这个堆栈溢出线程获得该代码)

得到这个输出:

00000001
00000010
00000011
Run Code Online (Sandbox Code Playgroud)



但如果你最后标记-128 ......

byte[] message = { 1, 2, 3, -128 };

00000001
00000010
00000011
0000000
Run Code Online (Sandbox Code Playgroud)

哇!七位二进制数?我觉得这与两个补码有关,但我试着读的越多,我就越困惑.我期待着10000000出现在第四行而不是......

任何人都可以解释为什么Integer.toBinaryString-128是相对简单的术语七位数?


Ye olde javadocThe unsigned integer value is the argument plus 2^32 if the argument is negative; otherwise it is equal to the argument. This value is converted to …

java binary byte twos-complement

5
推荐指数
1
解决办法
1210
查看次数

Python中的"Bitwise Not"不考虑2的补码

我需要在Python中执行"〜"操作,但不考虑2的补码.我设法通过使用XOR来做到这一点,你知道另一种方法吗?(更高效)

a = 0b101
b = 0b10101

print bin(a ^ (2 ** a.bit_length() - 1)) #0b10
print bin(b ^ (2 ** b.bit_length() - 1)) #0b1010
Run Code Online (Sandbox Code Playgroud)

python binary twos-complement

5
推荐指数
1
解决办法
540
查看次数

imul和idiv在8086上到底是如何工作的?

我试图弄清楚 8086 微处理器的 imul 和 idiv 指令是如何工作的。

我知道这一点: 1. mul 和 div 是无符号数的乘法和除法 2. imul 和 idiv,也是有符号数的乘法和除法

我搜索了整个网络,上面写的内容是我找到的唯一信息,但以不同的方式编写。

我有这个:

mov AX, 0FFCEh
idiv AH
Run Code Online (Sandbox Code Playgroud)

因为 ah 是一个字节,AL=AX/AH(结果)且 AH=余数

在指令之后,我得到AX=0032h,显然余数为 0,结果为 32。有人能解释一下它是如何得到这个结果的吗?我需要知道如何解释指令是如何工作的(一点一点)。

imul 指令也是如此。

我有:

mov AX, 0FF10h
imul AL
Run Code Online (Sandbox Code Playgroud)

因为AL是一个字节,所以乘法的结果将保存到AX中。执行 imul 指令AX=0100h后,为什么不是 F100h ?

我不知道CPU实际上是如何执行mul、div、imul和idiv的。如果有人能为我说明这些差异,我将非常感激。

谢谢!

binary x86 assembly negative-number twos-complement

5
推荐指数
1
解决办法
1万
查看次数

解释为什么 x == ~(~x + 1) + 1 (二进制补码和返回!)

众所周知,内存中的负数通常表示为二进制补码

from x to ~x + 1
Run Code Online (Sandbox Code Playgroud)

为了回来,我们不会做明显的事情,比如

~([~x + 1] - 1)
Run Code Online (Sandbox Code Playgroud)

但我们这样做

~[~x + 1] + 1
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么它总是有效吗?我想我可以用 1 位、2 位、3 位数字来证明它,然后使用数学归纳法,但这并不能帮助我理解它究竟是如何工作的。

谢谢!

binary proof twos-complement

5
推荐指数
1
解决办法
571
查看次数

硬件如何知道一个变量是正数还是负数?

如果这个问题太基本,我很抱歉......我只是没有在任何地方找到答案。

假设我像这样声明了一个 C 变量:

unsigned int var = 241;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,var 是无符号的,所以我的目的是让它具有十进制值 241。

或者我可以这样声明:

signed int var = -15;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我将其声明为有符号整数,因此根据我的理解,它应该具有十进制值 -15。

但是,这两次,我都假设 var 将在内存(硬件)中声明如下:1111 0001。

那么处理器如何知道在硬件中的最低级别我打算将其声明为 241 还是 -15?我知道用于表示负数等的二进制补码表示法,但是,我假设在硬件中,处理器只能看到一系列 1 和 0,然后通过切换某些 IC 的状态对其进行一些操作。处理器如何知道是解释标准二进制(无符号)还是 2 的补码(有符号)中的位序列?

还有另一个有点不相关的问题:

  1. 在 CI 中可以这样做:

    无符号整数 var = -15; printf("变量是:%d", var); 这将按预期打印 -15。为什么,当我这样做时:

有符号 int var = 0xF1; //或 0b11110001 printf("The var is: %d ", var);

我得到 241 而不是 -15?既然我声明它是有符号的并且在二进制补码中 0xF1 是 -15 为什么我得到的值 241 相当于标准二进制中的 0xF1 ?

  1. 为什么编译器让我做这样的事情: unsigned int var = -15;

它不应该抛出一个错误,告诉我我不能将负值分配给我声明为无符号的变量吗?

谢谢你,我为我的许多可能是基本的问题道歉,我不知道的太多了:D。

c hardware assembly twos-complement

5
推荐指数
2
解决办法
166
查看次数