问题标签 [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.

0 投票
10 回答
80406 浏览

java - 在 Java 中,整数如何在内部以位级别表示?

我试图了解 Java 如何在内部存储整数。我知道所有java原始整数都是有符号的(除了short?)。这意味着该数字在一个字节中可用的位减少了。

我的问题是,是否所有整数(正数和负数)都存储为二进制补码,或者只是二进制补码中的负数?

我看到规格说x bit two's complement number。但我经常感到困惑。

例如:

编辑

要清楚,x = 15

因此,如果您的答案是 all数字存储为二进制补码,那么:

这里的混乱再次是标志说,两者都是负数。可能是我误读/误解了吗?

编辑 不确定我的问题是否令人困惑。被迫隔离问题:

我的问题正是:正数存储在,binary as is而负数存储为two's complement

有人说所有都存储在二进制补码中,一个答案说只有负数存储为二进制补码。

0 投票
5 回答
10956 浏览

c - 使用 2 的补码从 int 转换为二进制字符串到 int

我知道有一个二进制字符串10001110正在使用 2 的补码。我知道它将是 8 位。

unsigned int它以等于 142的形式提供给我。

然后我需要将其转换回10001110

然后反转所有位并添加一个导致它等于01110010

然后将其转换为signed int等于 -114。

我怎样才能做到这一点?我对 C 语言比较陌生,并且花了很长时间试图弄清楚它!

本质上,我想编写一个接受unsigned int142 并返回signed int-114的函数

0 投票
3 回答
2196 浏览

binary - 二进制补码

据我所知,二进制补码算法是:

1.用二进制表示十进制。
2.反转所有位。
3.最后一位加1。

对于数字3,它的表示是:0000000000000011二进制补码的结果将1111111111111101-3
到目前为止,一切都很好。但是对于2它的表示是0000000000000010二进制补码结果的数字将是1111111111111101,它不是 2 而是 -3。
我究竟做错了什么?

0 投票
4 回答
341 浏览

c# - 为什么 BitConverter 会缩小我已经分配的数组?(我试图防止二进制补码问题)

我正在分配一个故意大于 BitConverter.GetBytes 结果的数组。我的目标是将最后一个字节留空,这样我就可以防止这个数字被视为两者的恭维并拥有 tempPosBytes2[

当我运行 BitConverter.GetBytes 时,我的数组tempPosBytes2似乎缩小了。

问题

幕后发生了什么,如何在不复制数组的情况下留下尾随字节?

我需要它与 BigInteger(byte[]) 一起使用,如下所示:

0 投票
2 回答
921 浏览

c# - 如何让 BigInteger 正确看到这个 Hex 字符串的二进制表示?

问题

我有一个byte[]转换为十六进制字符串,然后像这样解析该字符串BigInteger.Parse(thatString,NumberSyles.Hexnumber)

这似乎很浪费,因为 BigInteger 能够接受一个字节 [],只要考虑到二进制补码。


一个工作(低效)的例子

根据 MSDN,最后一个字节的最高有效位应为零,以便以下十六进制数为正数。以下是存在此问题的十六进制数示例:

好的,让我们将该字符串传递给 的静态方法BigInteger

既然我有一个数据基线,并且知道有效的转换,我想让它更好/更快/等等。


一个不工作(高效)的例子

byte[]现在我的目标是往返 aBigInt并使结果看起来像 25420294593250030202636073700053352635053786165627414518. 让我们开始吧:

因此,根据 MSDN,我的最后一个字节需要一个零,以避免我的数字被视为二进制的恭维。我将添加零并打印出来以确保:

好的,让我们将其传递byte[]给 的构造函数BigInteger

如果我不添加尾随零,我跳过的是 bigInt 对我的字节数组所做的示例。发生的事情是我得到一个错误的负数。如果你愿意,我会发布。

那么我做错了什么?

0 投票
3 回答
16028 浏览

assembly - 为什么 x86(-64) 上的有符号和无符号乘法指令不同?

我认为 2 的补码的全部意义在于,对于有符号和无符号数字,操作可以以相同的方式实现。Wikipedia 甚至专门将乘法列为受益的操作之一。那么为什么 x86 对每个都有单独的指令,mul并且imul?x86-64 仍然如此吗?

0 投票
4 回答
1127 浏览

c++ - 解释代码片段“int i:2;”中 C++ 中“:”运算符的使用

可能重复:
这个 C++ 代码是什么意思?

在以下 C++ 代码中

在运行以下代码时,我得到输出 1 -2 3

请参考上述代码解释“:”运算符的含义,以及出现这种奇怪输出的原因;

0 投票
2 回答
3941 浏览

java - 计算 n 位 2 的补数的绝对值

该方法接受一个 n 位 2 的补数,我们试图找到其绝对值,以及该数字的位数。这里有些例子:

绝对(0x00001234, 16);// => 0x00001234

绝对(0x00001234, 13);// => 0x00000DCC

所以你可以看到在第一个例子中 0x00001234 只是产生自己,因为它有 16 位,它有足够的前导零来成为它自己。

但是,对于第二个示例,使用 13 位会使 0x00001234 的符号位为 1,因此当您将此 13 位数字转换为正数时,它会产生 0x00000DCC。

我觉得到目前为止我所拥有的应该可以工作,但是在某些情况下它不起作用:/知道出了什么问题或我应该朝哪个方向前进吗?

编辑:也忘了提一下,我们不能使用 >>> 或 +,-,*,/ 除非我们只是增加 1。

0 投票
3 回答
66733 浏览

binary - 带 2 补码的二进制减法

我需要帮助使用 2 的表示法减去二进制并为每个数字使用 5 位:

1) -9 -7 = ? 有溢出吗?

-9 = 01001(2 的补码 = 10111)和 -7 = 00111(2 的补码 = 11001)

现在我们需要添加,因为我们使用的是 2 的补码

10111 +11001 = 100000 但是这个答案没有意义。另外,我假设有溢出,因为答案中有超过 5 位。

2)6 - 10,与之前相同的过程。负二进制数对我来说没有意义

0 投票
2 回答
15094 浏览

vhdl - 如何在不使用加法器的情况下制作数字的 2 补码

在用二补码来反转数字的符号时,您通常只需将每一位取反并加 1。例如:

在 VHDL 中是:

以这种方式,合成器使用 N 位加法器。

不使用加法器是否有另一种更有效的解决方案?