首先,这不是一个重复的问题,因为它没有回答我下面的问题。
我搜索了许多资源,但最终没有清楚地了解如何使用 2 的补码执行有符号数除法,特别是对于除数或被除数之一或两者都为负数的情况。
我阅读了弗洛伊德的《数字基础知识》第二章中的有符号数除法部分及其所有示例和问题。我什至阅读了解释除法的互联网资源,但他们只使用正数(如下所述):
,但是 100/-25 或 -100/25 或 -100/-25 呢?要遵循什么规则?
谁能给出一个简单的解释,例如如何将 14 除以 -7?
我正在读一本书.在书中写道 -
浮点加法满足以下单调特性:
如果a>=b再(x + a) >= (x+b)对任何价值a,b和x其他比NaN.无符号或二进制补码的加法不符合实数(和整数)加法的这一性质.
浮点如何服从它?
为什么无符号或两个补码不符合它?
c floating-point twos-complement unsigned-integer real-number
请看一下这两段伪汇编代码:
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) ?
我需要以与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) 我正在阅读有关二进制补码的内容,我知道这种方法最有效,但也可能存在一些缺点。我找不到任何缺点,是否存在转换为二进制补码无法正确表示数字的情况?
简单的场景:你有一个字节数组
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 javadoc说The 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 …
我需要在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) 我试图弄清楚 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的。如果有人能为我说明这些差异,我将非常感激。
谢谢!
众所周知,内存中的负数通常表示为二进制补码
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 位数字来证明它,然后使用数学归纳法,但这并不能帮助我理解它究竟是如何工作的。
谢谢!
如果这个问题太基本,我很抱歉......我只是没有在任何地方找到答案。
假设我像这样声明了一个 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 的补码(有符号)中的位序列?
还有另一个有点不相关的问题:
在 CI 中可以这样做:
无符号整数 var = -15; printf("变量是:%d", var); 这将按预期打印 -15。为什么,当我这样做时:
有符号 int var = 0xF1; //或 0b11110001 printf("The var is: %d ", var);
我得到 241 而不是 -15?既然我声明它是有符号的并且在二进制补码中 0xF1 是 -15 为什么我得到的值 241 相当于标准二进制中的 0xF1 ?
它不应该抛出一个错误,告诉我我不能将负值分配给我声明为无符号的变量吗?
谢谢你,我为我的许多可能是基本的问题道歉,我不知道的太多了:D。