我正在设计一个简单的玩具指令集和随附的模拟器,并且正在尝试找出支持哪些指令。在算术方面,我目前有无符号加法、减法、乘法和除法。但是,我似乎无法找到以下问题的明确答案:哪些算术运算符需要签名版本,哪些算术运算符的无符号和补码签名版本等效?
例如,1111 的补码等于 -1。如果你加 1 并假装它是一个无符号数,你会得到 0000,即使将其视为 -1,这也是正确的。然而,这对所有数字都适用吗?那么其他三个运算(减法、乘法、除法)呢?
我没有学习IT,而且最近才发现了位移和两个补码的应用.那么,您能否在解释中使用简单的英语,并假设我几乎不了解任何有关IP地址,位操作和Java数据类型的内容?
今天,我发现了以下一段代码(缩写):
long m = (-1) << (byte) 16;
Run Code Online (Sandbox Code Playgroud)
现在,这是用于IP子网掩码.我知道我需要从4个8位的块(即4个字节)开始,并且所有位都必须"打开":11111111 11111111 1111111 1111111接下来,零从右侧移入,在这种情况下是16位的值; 所以我们得到11111111 11111111 00000000 0000000了面具.
但我确实有几个问题:
16是必须的类型byte吗?long.当上面的表达式运行时,-1转换为 - 有效 - 4x8bit块.Java如何知道它需要32位/位(一个IP地址'长度),而不是16或8,当应用两个补码时?(我猜这与long数据类型有关?)-1开始使用两个补码?(谷歌给你-0b1如果你问它是什么-1二进制文件.我首先想到它可能与溢出有关,但它不是,它是......?)更新:该16在由一个方法运行时产生; 我只是在这里放一个常数作为例子.事后看来可能是一个坏主意......
英特尔软件开发手册对此说明进行了neg说明:
如果源操作数为0,则CF标志设置为0; 否则设置为1. OF,SF,ZF,AF和PF标志根据结果设置.
我认为AF和CF会被设置为好像neg %eax被替换为,
not %eax # bitwise negation
add $1, %eax
Run Code Online (Sandbox Code Playgroud)
但事实并非如此,在实际CPU上设置AF和CF时否定0x6ffffef5.
使用六位一和二的补码表示我试图解决以下问题:
12 - 7
Run Code Online (Sandbox Code Playgroud)
现在,我先拿二进制12和二进制7.
12 = 001100 - 6 bit
7 = 000111 - 6 bit
Run Code Online (Sandbox Code Playgroud)
然后,我会将这个位翻转为两个补码并添加一个吗?
12 = 110011 ones complement
+ 1
-------
001101
7 = 111000 ones complement
+ 1
---------
111001
Run Code Online (Sandbox Code Playgroud)
然后,将这两个补码加在一起
001101
+111001
-------
1000110 = overflow? discard the last digit? If so I get 5
Run Code Online (Sandbox Code Playgroud)
现在,如果我有一个像
-15 + 2
Run Code Online (Sandbox Code Playgroud)
如果它是零,我会在MSB上添加一个符号幅度?
喜欢:
-15 = 001111 6 bit
Run Code Online (Sandbox Code Playgroud)
在翻转位之前,我会在这里添加1吗?
= 101111
Run Code Online (Sandbox Code Playgroud) 我还没有找到最低签名负数没有等效签名正数的原因?我的意思是在3位二进制数字中为简单起见100是-4?但我们不能在签名格式中得到积极的4,因为我们不能.它溢出来了.那么我们怎么知道两个补码1000是-4 1000 0000是-128等等?我们没有原始正数
假设我们-5用四位表示一个十进制数:1011,并想将一个数左移乘以2:
1011 << 1
Run Code Online (Sandbox Code Playgroud)
此操作返回0110,它是6,而不是我们希望的-10。
(我假设这仅适用于第二位为0的负数,即负数接近某个范围的最小可表示负数)
binary bit-manipulation bit-shift negative-number twos-complement
首先,这不是一个重复的问题,因为它没有回答我下面的问题。
我搜索了许多资源,但最终没有清楚地了解如何使用 2 的补码执行有符号数除法,特别是对于除数或被除数之一或两者都为负数的情况。
我阅读了弗洛伊德的《数字基础知识》第二章中的有符号数除法部分及其所有示例和问题。我什至阅读了解释除法的互联网资源,但他们只使用正数(如下所述):
,但是 100/-25 或 -100/25 或 -100/-25 呢?要遵循什么规则?
谁能给出一个简单的解释,例如如何将 14 除以 -7?
我目前正在阅读一本关于C#编程的书,它简要介绍了溢出和下溢,并且作者总结了当你超越特定类型的允许范围时会发生什么.
例
short a = 30000;
short b = 30000;
short sum = (short)(a + b); // Explicitly cast back into short
Console.WriteLine(sum); // This would output the value -5536
Run Code Online (Sandbox Code Playgroud)
所以short类型只有-32768到32767的范围,书中给出的解释是"对于整数类型(byte,short,int和long),最高位(溢出)被丢弃这是特别奇怪的,因为计算机然后将其解释为环绕.这就是我们在示例中最终得到负值的原因.如果从特定类型的最大值开始,您可以很容易地看到这种情况发生(例如,short.MaxValue)并添加一个." C#Players Guide第二版,第9章,第58页
你最终会达到最低限度(-32768).
我有一个问题理解这一点当作家谈到"计算机将其解释为环绕"时我感到困惑
我尝试理解这个的方式是短类型使用2个字节(16位)
所以数字32767 = 0111111111111111,如果我要+1到二进制字符串我最终得到32768 = 1000000000000000(不能用短类型表示为最大值是32767)所以编译器给出-32768.为什么它最终成为负面?
我理解使用二元恭维来表示负数的概念,有人可以在这里纠正我的想法或详细说明因为我不完全理解为什么我们只使用16位的15位来表示正范围和最重要的位负范围
我正在读一本书.在书中写道 -
浮点加法满足以下单调特性:
如果a>=b再(x + a) >= (x+b)对任何价值a,b和x其他比NaN.无符号或二进制补码的加法不符合实数(和整数)加法的这一性质.
浮点如何服从它?
为什么无符号或两个补码不符合它?
c floating-point twos-complement unsigned-integer real-number
其中' - '表示负x,'&'表示按位AND.
这些数字在程序中是8位2的补码,我似乎无法找到输入和输出之间的相关性.
8 & (-8) = 8
7 & (-7) = 1
97 & (-97) = 1
Run Code Online (Sandbox Code Playgroud)
所以可能重要的是位操作?
0000 1000 & (1111 1000) = 0000 1000
0000 0111 & (1111 1001) = 0000 0001
0110 0001 & (1001 1111) = 0000 0001
Run Code Online (Sandbox Code Playgroud)
在上述每种情况下,高4位总是最终为0,但我找不到输入之间的相关性以及低4位最终的结果.
有任何想法吗?
解答: 找到最低设置位
twos-complement ×10
binary ×6
bit ×2
c ×2
assembly ×1
bit-shift ×1
bitwise-and ×1
c# ×1
c++ ×1
division ×1
instructions ×1
intel ×1
java ×1
negation ×1
real-number ×1
signed ×1
x86 ×1