问题标签 [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.
decimal - 使用 16 位将十进制数转换为 2 的补码
问题:
使用 16 位的 2 补码中的十进制数 -234 是多少?
我只需要将 234 转换为二进制吗?
javascript - 将有符号十进制转换为用二进制补码编码的十六进制
我需要通过二进制补码表示法将有符号整数编码为十六进制。例如我想转换
到目前为止,我一直在研究以下几行:
这与 Wolfram Alpha显示的内容相匹配,但我不确定如何获得数字的签名 24 位 int 表示 (ffffa0c9)。
我已经研究出如何获取无符号二进制数并将其表示为二进制补码:
但我不确定将这个数字的二进制表示转换为十六进制。
有任何想法吗?
c - 在非二进制补码系统上,普通字符通常/总是无符号吗?
显然,标准对此只字未提,但从实际/历史的角度来看,我更感兴趣:具有非二进制补码算术的系统是否使用char
无符号的普通类型?否则,您可能会遇到各种奇怪的情况,例如 null 终止符的两种表示形式,以及无法表示char
. 这种奇怪的系统真的存在吗?
hardware - 是否有称为“2 的补码”的硬件单元?
我知道要进行减法运算,您应该对第二个数字进行 2 的补码转换。是否有专门的硬件来检查 MSB,如果发现它是 1,它会进行转换吗?
另外,这个系统是否用于浮点减法?
assembly - sra(算术右移)与 srl(逻辑右移)
请看这两条伪汇编代码:
1)
2)
在第一种情况下,输出是:
212
13
13
后者是:
-212
107374...
-14
但不应该:sra (-53) = - (srl 53) ?
twos-complement - 为什么补码中的位反转?
在为二进制补码添加 1 之前存储带补码的负数时,为什么除了符号之外的所有位都反转了?我想如果唯一不同的是标志,那就更简单了。我能想到的唯一原因是它以某种方式使计算机更容易。
binary - 二进制2的补码乘法?
我必须手动解决 MIPS 乘法问题,但我遇到了麻烦。
我有两个寄存器,$8
其中包含 -1073741824 的二进制补码表示(即 2^30)并且$9
二进制补码为 +3,我需要找到此 MIPS 指令的结果
我很迷茫。我是否需要先将值转换为二进制补码然后使用二进制乘法?
c++ - 减去两个未知位大小的值
我正在尝试使用二进制补码将两个值相减。我有溢出位的问题。由于我的容器包含一个无限位大小的整数,我不知道结果的最高位是真的来自结果还是只是溢出。我如何在不使用的情况下摆脱溢出-
(我不能这样做1 << bits - 1
,因为这将涉及使用operator-
尚未工作的容器)
0b1111011111 - 0b111010000 -> 0b1111011111 + 0b000110000 -> 1000001111
vs(通常)
0b00000101 - 0b000000001 -> 0b00000101 + 0b11111111 -> 0b100000100 -> 0b00000100
java - java中2的补码十六进制数到十进制数
我有一个表示 2 的补码的十六进制字符串。有没有一种简单的方法(库/函数)可以将十六进制转换为十进制而不直接使用它的位?
EG 这是给定左侧十六进制的预期输出:
谢谢!
integer - VHDL 补码计数器问题:将 std_logic 转换为整数
本质上,我的问题是:“这不是更容易吗? ”;什么是'this',如下(代码也是):
我想要一种“补码”计数器功能,用 VHDL 实现,它基本上会在每一步中反转/补码/不是计数器值,从而为测试提供稍微丰富的位模式。当然,我希望它是可综合的(因此计数器值可以分配给引脚)和可移植代码(即仅实现 IEEE 库,没有STD_LOGIC_ARITH
)。我也不想默认将所有都视为无符号(所以我想避免STD_LOGIC_UNSIGNED
)。
简而言之,这个计数器可以描述为:给定初始值 C[0],那么每个时钟滴答的值将是:
...或者给定 C 是 16 位宽(这将导致无符号 Cmax = 65535 和 Cmax/2 = 32768),它也可以写成:
这里的诀窍是计数器应该只增加一次 - 如果它在互补和“正常”范围内都增加,那么不会发生任何变化(方程将在两个值之间“振荡”)。
因此,鉴于检查 C[i]<(Cmax/2) 与检查 C 的最高有效位(第 15 位)基本相同,我认为我可以使用以下方法在 VHDL 中轻松实现类似的东西:
男孩,我对“容易”的看法是不是错了:)
第一个问题是,上面的等式有可能以 65535+1 结尾,在这种情况下,结果需要 17 位(即溢出);就我而言,我只想截断/忽略任何“进位”。
这导致了使用什么的问题:
std_logic_vector
已定义补码not()
;但它没有+
定义(添加)natural
/integer
可能在内部占用 32 位,因此不必指定它们的位宽;它们支持算术+
,但不支持补码not()
- 我也试过
unsigned
,也有一些问题(不记得是哪个)
第 15 位(MSB)只有在 Y 为 时才能提取std_logic_vector
,在这种情况下,Y(15) 为单字节std_logic
- 但随后需要将其转换为integer
类型,否则+
未定义加法:|
所以,我目前的解决方案(如下)首先有两个计数器寄存器的副本;一个是SIGNAL wCntReg : STD_LOGIC_VECTOR(15 DOWNTO 0)
;另一个是SIGNAL tmp_na : natural
。然后:
- 有两个时钟:一个“主”@ 50 MHz,另一个是“计数器”时钟:主时钟 16 倍分频(3.125 MHz)。
- “计数器”时钟应在下降沿激活计数器值的计算
- 计算是通过
natural
变量执行的(从变量中复制STD_LOGIC_VECTOR
) - 显然,
std_logic
只有先转换为才能integer
转换为(我很幸运在网上std_logic_vector
找到了该功能)。vectorize
这里最讨厌的部分是如何将natural
变量值反馈回那个STD_LOGIC_VECTOR
;我可以构建的唯一有效命令是:
...; 但是,请注意,此命令基本上是“设置”该值,下次运行同一命令时,该值将“生效” 。因此,它不能在“计数器”时钟进程中运行——在下面的代码中,我将它放在更快的“主”时钟进程中。
最后,下面的代码确实有效(通过 ISE WebPack 中的行为模拟) - 但是,我仍然想知道是否有更直接的方法来解决这个问题。
提前感谢您的任何答案,干杯!
编码: