我对Java很陌生,我对Java中的有符号字节感到非常困惑。
byte a = -128;
byte b = 126;
System.out.println((byte)(a ^ b));
输出是-2。有人能解释一下为什么我们会得到这个吗?-2是-128 XOR 126的正确结果吗?
另一个问题是,我有一个字节b,我希望它能够异或所有可能的字节,我的代码是
byte i = -128
while (i <= 127) {
byte c = (byte) b ^ i;
i++;
}
这是正确的吗?
我找不到对非还原整数除法的后期修正。由于某些原因,我经常会遇到这样的情况:我在不需要修改的地方更正,或者在需要的时候不更正
以下是该算法的伪代码。Dividend为16位,其他为8位。我说的Dividend_Sign,Remainder_Sign是指它们的最大有效位是1,所以它们的补码是负的。
LoopCounter = 8;
do {
Shift Dividend Left with 0 in LSB;
if (Dividend_Sign XOR Divisor_Sign) {
Shift 0 into Quotient;
DividendH
Java告诉我们:
“公共静态int bitCount(int i)
返回指定int值的互补二进制表示中的一位数。这一职能有时被称为人口计数。
返回:指定的int值的互补二进制表示中的一位数。自: 1.5“
因此,如果我们取255个,并将其转换为二进制,则得到11111111。如果我们把它转换成两个的补码版本,我们得到了00000001,使得一位的数目是1。但是,如果我运行以下代码:
import java.lang.*;
public class IntegerDemo {
public static void main(String[] args) {
int i = 255
Java的BigInteger类使用以下代码从较大的数字中减去一个较小的数字: private static int[] subtract(int[] big, int[] little) {
int bigIndex = big.length;
int result[] = new int[bigIndex];
int littleIndex = little.length;
long difference = 0;
// Subtract common parts of both numbers
我正在读这本书: CS-APPe2。C有无符号和有符号的int类型,在大多数体系结构中使用两种补码算法来实现有符号值;但是在学习了一些汇编代码之后,我发现区分无符号和签名的指令很少。所以我的问题是:
区分有符号和无符号是编译器的责任吗?如果是的话,它是怎么做到的?
谁实现了两种补码算法-- CPU还是编译器?
添加更多信息:
在学习了一些更多的说明之后,实际上它们中有一些区分了符号和无符号,例如setg、seta等。此外,CF和适用于无符号和分别。但是大多数整数算术指令处理无符号和有符号相同。
int s = a + b
和
unsigned s = a + b
生成相同的指令
我试图理解Java是如何在内部存储整数的。我知道所有的java基本整数都是有符号的(除了short?)。这意味着在一个字节中该数字少了一位可用。
我的问题是,是否所有的整数(正和负)都作为2的补码存储,或者只有负数在2的补码中?
我看到说明书上写着x bit two's complement number。但我经常感到困惑。
例如:
int x = 15; // Stored as binary as is? 00000000 00000000 00000000 00001111?
int y = -22; // Stored as two complemented valu