问题标签 [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 整数中的整数不使用所有 32 位或 64 位?
我正在研究 32 位和 64 位。我注意到可以存储在 32 位中的整数值的范围是,±4,294,967,295
但 Javaint
也是 32 位的(如果我没记错的话),它存储的值高达±2 147 483 648
. 同样的事情long
,它存储来自0 to ±2^63
但 64 位存储值的±2^64
值。为什么这些价值观不同?
c - 二进制补码 stm32 c
我有一个数字是“有效字节”,它可能是 0 或 255。
这意味着 0 或 -1。
如何一次将 255 转换为 -1。
我有一个对我不起作用的功能:
java - 为什么叫补码?
可能重复:
二的补码,为什么叫“二”
为什么使用符号位来表示负数称为“2 的补码”?这样的名字是怎么来的,谁能简单解释一下,非常感谢。顺便说一句,如果不使用符号位,是否意味着无法表示负数?对不起,如果在这里问的问题太大了,我只想在我的脑海中真正解决这个问题。现在,太乱了。
c++ - 为什么 -INT_MIN = INT_MIN 在有符号的二进制补码表示中?
我仍然没有找到为什么最低的有符号负数没有等效的有符号正数的原因?为简单起见,我的意思是 3 位二进制数 100 是 -4?但我们不能有一个正4的签名格式,因为我们不能。它溢出了。那么我们如何知道二进制补码 1000 是 -4 1000 0000 是 -128 等等?我们没有原始的正数
math - x86中的进位/溢出和减法
我试图绕过 x86 中的溢出和携带标志。
据我了解,为了添加有符号 2 的补码,只能以四种方式之一生成标志(我的示例是 4 位数字):
- pos+pos = 否定(溢出)
- 0111 + 0001 = 1000 (7 + 1 = -8)
- pos+neg = pos(进位)
- 0011 + 1110 = 0001 (3 + -2 = 1)
- 否定+否定=否定(进位)
- 1111 + 1111 = 1110 (-1 + -1 = -2)
- neg+neg = pos(溢出和进位)
- 1000 + 1001 = 0001 (-8 + -7 = 1)
那么,在 x86 汇编中,从 A 中减去 B 会生成与添加 A 和 -B 相同的标志吗?
java - 为什么 Long.toHexString(0xFFFFFFFF) 返回 ffffffffffffffff
这是我在java中看到的,它让我很困惑。
Long.toHexString(0xFFFFFFFF)
返回ffffffffffffffff
同样,0xFFFFFFFF
和Long.parseLong("FFFFFFFF", 16)
不相等。
c - 仅使用按位函数查找表示 2 的补码需要多少位
我们可以假设 int 在 2 的补码中是 32 位唯一合法的运算符是:!~ & ^ | + << >>
在这一点上,我正在使用蛮力
...最后两条语句重复了 32 次。每次将 x 移动一位时,这会将 1 加到 a 上,对于所有 32 位,!= 0
使用测试编译器,它说我的方法在测试用例 0x7FFFFFFF(一个 0 后跟 31 个 1)上失败,并说这个数字需要 32 位来表示。我不明白为什么这不是 31 (我的方法计算出来的) 谁能解释为什么?我需要改变什么来解决这个问题?
twos-complement - 用 2' 补码技术表示负数?
我正在使用 2' 补码来表示二进制形式的负数
案例1:数字-5
根据 2' 补码技术:
将 5 转换为二进制形式:
00000101
,然后翻转位
11111010
,然后加 1
=> 结果:11111011
为了确保这是正确的,我重新计算为十进制:
案例2:号码-240
采取相同的步骤:
我误会了什么?
java - 为什么 Integer.MAX_VALUE + 1 == Integer.MIN_VALUE?
System.out.println(Integer.MAX_VALUE + 1 == Integer.MIN_VALUE);
是真的。
我知道Java中的整数是32位的,不能超过2 31 -1,但我不明白为什么在它的MAX_VALUE
结果中加1MIN_VALUE
而不是在某种异常中。更不用说像 Ruby 那样将透明转换为更大的类型。
这种行为是否在某处指定?我可以依靠它吗?
java - Java 中的 String.format() 和十六进制数字
我试图弄清楚为什么String.format()
会这样。
上下文:系统编程课,编写汇编程序。
目标文件中有一个 5 个字符的十六进制字段,我是从一个值创建的。
尝试使用:String.format("%05X", decInt);
这适用于正数 (11 -> 0000B
) 但是它对于负数 (-1 ->FFFFFFFF
而不是FFFFF
)失败
我想我可以只取最后 5 个字符的子字符串,但我仍然想弄清楚它为什么会这样。