我试图弄清楚 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的。如果有人能为我说明这些差异,我将非常感激。
谢谢!
在学习 A Level 计算时,教科书、试题和老师反复告诉我们,如果负归一化浮点二进制数以 11 开头,那么它就不是归一化的。
对于负 11 的二进制补码,它可以写为 10101,因此标准化形式的数字将是 10101 00100,这遵循数字开头没有 11 的规则
但对于负 1,二进制补码版本是 11111,那么规范化版本会是什么,11111 00100 可以工作,但违反了规则,011111 00101 使数字为正数并使用了太多位,10111 00100 使负 9 而不是负 1
基本上为什么数字不能以 11 开头以及如何用解释来表示负一?
binary normalization floating negative-number twos-complement
众所周知,内存中的负数通常表示为二进制补码
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 位数字来证明它,然后使用数学归纳法,但这并不能帮助我理解它究竟是如何工作的。
谢谢!
在 Go 中如何使用二进制补码表示法将负整数表示为二进制?
例如:
n := int64(-1)
fmt.Printf("%b", n)
fmt.Println(strconv.FormatInt(n, 2))
Run Code Online (Sandbox Code Playgroud)
两行都打印-1。结果应该是这样的ffffffffffffffff。
如果这个问题太基本,我很抱歉......我只是没有在任何地方找到答案。
假设我像这样声明了一个 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。
我想知道这个陈述背后的逻辑,证据.对于任何x,C表达式-x,~x + 1和〜(x-1)都产生相同的结果.我可以证明这对于具体的例子是正确的.我认为证明这一点的方法与两个补码的属性有关.有任何想法吗?
这就是我在java中看到的,它让我感到困惑.
Long.toHexString(0xFFFFFFFF) 回报 ffffffffffffffff
同样,0xFFFFFFFF和Long.parseLong("FFFFFFFF", 16)不相等.
在双补码中反转一个数字的符号,你通常只是否定每一位并添加1.例如:
011 (3)
100 + 1 = 101 (-3)
Run Code Online (Sandbox Code Playgroud)
在VHDL中是:
a <= std_logic_vector(unsigned(not(a)) + 1);
Run Code Online (Sandbox Code Playgroud)
通过这种方式,合成器使用N位加法器.
没有使用加法器,还有另一种更有效的解决方案吗?
我知道转换的十进制到二进制Integer.toBinaryString(355) = 0000000101100011和
Integer.toBinaryString(-355) = 1111111010011101(其中,i取32位结果的低16位).
我想做的是另一种方式,并采用16位二进制补码二进制字符串并转换为十进制.
即
0000000000110010 = 50
1111111111001110 = -50
Run Code Online (Sandbox Code Playgroud)
而不是 1111111111001110 = 65486
我该怎么做?
我是C的初学者.我最近了解了2's Complement以及其他表示负数的方法,以及为什么2's complement最合适的方法.
我想问的是,例如,
int a = -3;
unsigned int b = -3; //This is the interesting Part.
Run Code Online (Sandbox Code Playgroud)
现在,用于转换int类型
标准说:
6.3.1.3有符号和无符号整数
当具有整数类型的值转换为除_Bool之外的另一个整数类型时,如果该值可以由新类型表示,则它将保持不变.
否则,如果新类型是无符号的,则通过重复地添加或减去一个可以在新类型中表示的最大值来转换该值,直到该值在新类型的范围内.
第一段不能用作-3无法表示的段落unsigned int.
因此第2段开始发挥作用,我们需要知道unsigned int的最大值.它可以在limits.h中找到UINT_MAX.在这种情况下的最大值是这样的计算是:4294967295
-3 + UINT_MAX + 1 = -3 + 4294967295 + 1 = 4294967293
Run Code Online (Sandbox Code Playgroud)
现在4294967293二进制是11111111 11111111 11111111 11111101并且-3在2的补码形式中11111111 11111111 11111111 11111101它们基本上是相同的位表示,无论我试图分配给无符号整数的负整数,它总是相同的.所以不是无符号类型冗余.
现在我知道printf("%d" , b)根据标准,这是一种未定义的行为,但这不是一种合理且更直观的做事方式.如果否定被表示为2's Complement现在,那么代表将是相同的,并且使用的其他方式很少,并且很可能不会在未来的发展中.
因此,如果我们只有一个类型说int,int x = …
c programming-languages language-concepts twos-complement unsigned-integer