问题标签 [twos-complement]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 在 Java 中,整数如何在内部以位级别表示?
我试图了解 Java 如何在内部存储整数。我知道所有java原始整数都是有符号的(除了short?)。这意味着该数字在一个字节中可用的位减少了。
我的问题是,是否所有整数(正数和负数)都存储为二进制补码,或者只是二进制补码中的负数?
我看到规格说x bit two's complement number
。但我经常感到困惑。
例如:
编辑
要清楚,x = 15
因此,如果您的答案是 all
数字存储为二进制补码,那么:
这里的混乱再次是标志说,两者都是负数。可能是我误读/误解了吗?
编辑 不确定我的问题是否令人困惑。被迫隔离问题:
我的问题正是:正数存储在,binary as is
而负数存储为two's complement
?
有人说所有都存储在二进制补码中,一个答案说只有负数存储为二进制补码。
c - 使用 2 的补码从 int 转换为二进制字符串到 int
我知道有一个二进制字符串10001110
正在使用 2 的补码。我知道它将是 8 位。
unsigned int
它以等于 142的形式提供给我。
然后我需要将其转换回10001110
然后反转所有位并添加一个导致它等于01110010
然后将其转换为signed int
等于 -114。
我怎样才能做到这一点?我对 C 语言比较陌生,并且花了很长时间试图弄清楚它!
本质上,我想编写一个接受unsigned int
142 并返回signed int
-114的函数
binary - 二进制补码
据我所知,二进制补码算法是:
1.用二进制表示十进制。
2.反转所有位。
3.最后一位加1。
对于数字3
,它的表示是:0000000000000011
二进制补码的结果将1111111111111101
是-3
。
到目前为止,一切都很好。但是对于2
它的表示是0000000000000010
二进制补码结果的数字将是1111111111111101
,它不是 2 而是 -3。
我究竟做错了什么?
c# - 为什么 BitConverter 会缩小我已经分配的数组?(我试图防止二进制补码问题)
我正在分配一个故意大于 BitConverter.GetBytes 结果的数组。我的目标是将最后一个字节留空,这样我就可以防止这个数字被视为两者的恭维并拥有 tempPosBytes2[
当我运行 BitConverter.GetBytes 时,我的数组tempPosBytes2
似乎缩小了。
问题
幕后发生了什么,如何在不复制数组的情况下留下尾随字节?
我需要它与 BigInteger(byte[]) 一起使用,如下所示:
c# - 如何让 BigInteger 正确看到这个 Hex 字符串的二进制表示?
问题
我有一个byte[]
转换为十六进制字符串,然后像这样解析该字符串BigInteger.Parse(thatString,NumberSyles.Hexnumber)
。
这似乎很浪费,因为 BigInteger 能够接受一个字节 [],只要考虑到二进制补码。
一个工作(低效)的例子
根据 MSDN,最后一个字节的最高有效位应为零,以便以下十六进制数为正数。以下是存在此问题的十六进制数示例:
好的,让我们将该字符串传递给 的静态方法BigInteger
:
既然我有一个数据基线,并且知道有效的转换,我想让它更好/更快/等等。
一个不工作(高效)的例子
byte[]
现在我的目标是往返 aBigInt
并使结果看起来像 25420294593250030202636073700053352635053786165627414518
. 让我们开始吧:
因此,根据 MSDN,我的最后一个字节需要一个零,以避免我的数字被视为二进制的恭维。我将添加零并打印出来以确保:
好的,让我们将其传递byte[]
给 的构造函数BigInteger
:
如果我不添加尾随零,我跳过的是 bigInt 对我的字节数组所做的示例。发生的事情是我得到一个错误的负数。如果你愿意,我会发布。
那么我做错了什么?
assembly - 为什么 x86(-64) 上的有符号和无符号乘法指令不同?
我认为 2 的补码的全部意义在于,对于有符号和无符号数字,操作可以以相同的方式实现。Wikipedia 甚至专门将乘法列为受益的操作之一。那么为什么 x86 对每个都有单独的指令,mul
并且imul
?x86-64 仍然如此吗?
java - 计算 n 位 2 的补数的绝对值
该方法接受一个 n 位 2 的补数,我们试图找到其绝对值,以及该数字的位数。这里有些例子:
绝对(0x00001234, 16);// => 0x00001234
绝对(0x00001234, 13);// => 0x00000DCC
所以你可以看到在第一个例子中 0x00001234 只是产生自己,因为它有 16 位,它有足够的前导零来成为它自己。
但是,对于第二个示例,使用 13 位会使 0x00001234 的符号位为 1,因此当您将此 13 位数字转换为正数时,它会产生 0x00000DCC。
我觉得到目前为止我所拥有的应该可以工作,但是在某些情况下它不起作用:/知道出了什么问题或我应该朝哪个方向前进吗?
编辑:也忘了提一下,我们不能使用 >>> 或 +,-,*,/ 除非我们只是增加 1。
binary - 带 2 补码的二进制减法
我需要帮助使用 2 的表示法减去二进制并为每个数字使用 5 位:
1) -9 -7 = ? 有溢出吗?
-9 = 01001(2 的补码 = 10111)和 -7 = 00111(2 的补码 = 11001)
现在我们需要添加,因为我们使用的是 2 的补码
10111 +11001 = 100000 但是这个答案没有意义。另外,我假设有溢出,因为答案中有超过 5 位。
2)6 - 10,与之前相同的过程。负二进制数对我来说没有意义
vhdl - 如何在不使用加法器的情况下制作数字的 2 补码
在用二补码来反转数字的符号时,您通常只需将每一位取反并加 1。例如:
在 VHDL 中是:
以这种方式,合成器使用 N 位加法器。
不使用加法器是否有另一种更有效的解决方案?