16得票2回答
如何检测二进制补码中的溢出?

我发现使用 二进制补码 进行正负数相减时,会产生溢出。例如,当我从2中减去1时,结果为:2 = 0010 1 = 0001 -> -1 = 1111 2 + (-1) -> 0010 + 1111 = 10001 这里的结果有第五位为10001 - 是否溢出?我找到了下列用于检测二...

38得票6回答
为什么在C#中,-3等于~2?

看不懂。为什么输出是"equal"? 代码: if (-3 == ~2) Console.WriteLine("equal"); else Console.WriteLine("not equal"); 输出:equal

12得票1回答
NEG指令如何影响x86上的标志位?

英特尔软件开发手册对neg指令如下描述: 如果源操作数为 0,则 CF 标志位设置为 0;否则设置为 1。OF、SF、ZF、AF 和 PF 标志根据结果设置。 我认为如果将 neg %eax 替换为以下代码,那么 AF 和 CF 应该被设置:not %eax # bitwise...

31得票5回答
为什么有符号字节的取值范围是从-128到127(二进制补码),而不是从-127到127?

我读到了Java中为什么字节的范围是-128到127? 128的二进制表示为10000000。反转后得到01111111,再加一变成10000000 因此结论是-128的二进制表示为10000000。 +128在8位二进制补码下无法表示,但这意味着我们可以用9位二进制来表示它,所...

35得票9回答
为什么 Integer.MAX_VALUE + 1 == Integer.MIN_VALUE?

System.out.println(Integer.MAX_VALUE + 1 == Integer.MIN_VALUE); 这段代码输出的结果是true。 我理解在Java中int类型是32位的,不能超过231-1,但我不明白为什么将1加到MAX_VALUE上会导致结果为MIN_VAL...

10得票10回答
2的补码示例,为什么不需要进位?

我正在观看David Malan的一些精彩讲座(这里),他正在讲解二进制。他谈到了有符号/无符号、反码和补码表示法。进行了4 + (-3)的加法运算,如下所示: 0100 1101 (flip 0011 to 1100, then add "1" to the end) ---- 0001 ...

15得票1回答
如果只需要低位结果,哪些2补数整数运算可以在不将输入高位清零的情况下使用?

在汇编编程中,经常需要从一个寄存器的低位计算出某些内容,而该寄存器并不保证其他位为零。在高级语言(如C)中,你只需将输入强制转换为小尺寸,让编译器决定是否需要单独清零每个输入的高位,或者是否可以在计算结果后截取结果的高位。 这在x86-64(也称为AMD64)中特别常见,原因有很多1,其中一...

11得票1回答
在golang中,^0是什么?

我看到代码库中有^0。 示例:type stat struct { ... min int64 ... } newStat := stat{min: ^0} ^0是什么意思?

13得票7回答
C编译器如何处理无符号和有符号整数?为什么无符号和有符号算术运算的汇编代码相同?

我正在阅读《CS-APPe2》这本书。C语言有无符号和有符号的int类型,在大多数架构中使用二进制补码算术来实现有符号值;但是在学习了一些汇编代码后,我发现很少有指令区分有符号和无符号。所以我的问题是: 编译器是否有责任区分有符号和无符号?如果是,它是如何做到的? 谁来实现二进制补码算术 ...

67得票6回答
为什么在32位计算机中,-(-2147483648)等于-2147483648?

我认为问题本身已经很明显了,可能与溢出有关,但我仍然不太理解发生了什么。在底层,按位运算发生了什么? 为什么-(-2147483648) = -2147483648 (至少在C语言中编译时)?