标签: twos-complement

二进制补码;0FFFFh 正,0FFFFh 负?

我从《装配艺术》一书中复制了这句话:

\n
\n

在二\xe2\x80\x99补码系统中,数字的HO位是符号位。如果HO位为零,则该数为正;如果 HO 位为 1,则该数字为负数。例子:

\n

对于 16 位数字:

\n

8000h为负,因为 HO 位为 1。

\n

100h为正,因为 HO 位为零。

\n

7FFFh是积极的。

\n

0FFFFh是负数。

\n

0FFFh是积极的。

\n
\n

我不明白最后两个例子。如果将这两个示例转换为二进制,则会得到0000 1111 1111 1111 1111第一个和0000 1111 1111 1111第二个示例。为什么前者是负数,后者是正数?在我看来,两者的最高位都是 0,因此两者都应该是正数。

\n

binary x86 twos-complement

2
推荐指数
1
解决办法
4885
查看次数

ARM中如何获取寄存器值的二进制补码?

假设我在寄存器 v1 中有一个 32 位有符号 int。我想获取该值的二进制补码以存储在另一个寄存器 v2 中。在普通数学中,这意味着我需要翻转所有 32 位,然后加 1。

如何翻转这些位?

assembly arm bit-manipulation twos-complement

2
推荐指数
1
解决办法
1万
查看次数

如何对 5 位值进行符号扩展?

我有一个无符号整数(32 位),其中存储了一个 n 位有符号数(2 的补码,因此 -16 \xe2\x89\xa4 x < 16,并且生成的无符号值在 0- 范围内) 15)。

\n

如何使用二进制补码将其有效地转换为带符号的解释?

\n

一个简短的例子来阐明我的意思:

\n
int numUnsigned = 15; // Store a 4-bit value 0b1111\nint numSigned = ???; // Convert to 4-bit signed value using two's complement\n// Now numSigned should be -1, since 0b1111 == -1\n
Run Code Online (Sandbox Code Playgroud)\n

我整个早上都在搞乱这些东西,但似乎无法把它弄好。

\n

c++ bit-manipulation twos-complement

2
推荐指数
1
解决办法
1558
查看次数

to_unsigned 做什么?

有人可以解释一下 VHDL 的to_unsigned是如何工作的或者确认我的理解是正确的吗?例如:

C(30 DOWNTO 0) <= std_logic_vector (to_unsigned(-30, 31))
Run Code Online (Sandbox Code Playgroud)

这是我的理解:

  • -30 是有符号值,以位表示为 1111111111100010
  • 所有位都应反转并添加“1”以构建 C 的值
  • 0000000000011101+0000000000000001== 0000000000011111

unsigned type-conversion vhdl twos-complement signed-integer

2
推荐指数
1
解决办法
5万
查看次数

6502内存中存储的字节是有符号的还是无符号的?

在为我的 6502/NES 模拟器创建指令函数时,我一直在理解 6502 中带符号字节和二进制补码的概念。显然,诸如 BMI 之类的分支指令在内存中使用带符号字节来进行前向/后向分支,而某些指令则使用内存中的带符号字节来进行前向/后向分支。指令允许使用负数进行算术运算。负标志还检测累加器的第 7 位。(二进制补码)

这是否意味着内存中的所有字节都已签名,并且我可以将内存初始化为int8_t CPUMEMORY[0x10000];或不初始化uint8_t CPUMEMORY[0x10000]

但令我困扰的是,当运算结果超过无符号 8 位限制(即 255)时,就会设置进位标志。但如果所有字节都已签名,这不应该是 127 吗?(溢出标志可以做到这一点,但是拥有进位标志有什么意义呢?)

assembly flags 6502 twos-complement

2
推荐指数
1
解决办法
2825
查看次数

将 24 位二进制补码转换为 int?

我有一个 C#/Mono 应用程序,可以从 ADC 读取数据。我的读取函数将其返回为 ulong。数据是二进制补码,我需要将其转换为 int。例如:

0x7FFFFF = + 8,388,607
0x7FFFFE = + 8,388,606
0x000000 = 0
0xFFFFFF = -1
0x800001 = - 8,388,607
0x800000 = - 8,388,608
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

c# mono integer data-conversion twos-complement

2
推荐指数
1
解决办法
4474
查看次数

为什么 2 的补码符号扩展通过添加符号位的副本来工作?

我们以将 16 位有符号数符号扩展为 32 位寄存器为例,例如mov $+/-5, %ax movswl %ax, %ebx

有两种可能的情况:

  1. 高位为零(数字为正)。这是非常容易理解和直观的。例如,如果我有数字5,则用零填充左侧很容易理解。例如:

                      00000000 00000101    # 5 (represented in 16 bits)
    00000000 00000000 00000000 00000101    # 5 (represented in 32 bits)
    
    
    Run Code Online (Sandbox Code Playgroud)
  2. 然而,对我来说最难理解的是当它是负数并且我们进行符号扩展时。例子:

                      11111111 11111011    # -5 (represented in 16 bits)
    11111111 11111111 11111111 11111011    # -5 (represented in 32 bits)
    
    Run Code Online (Sandbox Code Playgroud)

是的,我知道我们只是用 填充高位1。但是什么让它发挥作用呢?也许对二进制数的“属性”的解释可以帮助我更好地理解这一点。

binary assembly bit-manipulation twos-complement sign-extension

2
推荐指数
1
解决办法
3092
查看次数

为什么用MSB作为符号位?

我正在阅读Kip Irvine关于x86汇编编程的书,在解释有符号整数时,提到MSB(最高有效位)用作有符号位,0代表+ve,1代表-ve,如果我不是的话错误的。但是,我不明白为什么使用 MSB 来表示符号。如果使用 LSB,恕我直言,更大的数字可以存储在相同的位数中。是否因为LSB,即第一位(第零位的位),对于表示奇数是必需的?

memory binary assembly twos-complement

2
推荐指数
1
解决办法
564
查看次数

为什么Java整数中的整数不使用全部32位或64位?

我正在研究32位和64位.我注意到可以存储在32位中的整数值范围是,±4,294,967,295但Java int也是32位(如果我没有记错的话),它存储的值最多为±2 147 483 648.同样的事情long,它存储来自0 to ±2^63但是64位存储±2^64值的值.为什么这些价值观会有所不同?

java 64-bit 32-bit twos-complement

1
推荐指数
1
解决办法
1769
查看次数

为什么选择QString("FFFFFFFF").toInt(0,16); 返回0?

您可能知道,0xFFFFFFFF在Two's Complement表示中等于-1(对于32位).但是以下代码:

qint32 aa = QString("FFFFFFFF").toInt(0, 16);
qDebug()<<aa;
Run Code Online (Sandbox Code Playgroud)

打印0.代码如下:

qint32 aa = 0xffffffff;
qDebug()<<aa;
Run Code Online (Sandbox Code Playgroud)

打印-1!

为什么是这样?

qstring qt twos-complement

1
推荐指数
1
解决办法
2364
查看次数