相关疑难解决方法(0)

什么是"2的补充"?

我在计算机系统课程中,并且一直在与Two's Complement一起挣扎.我想了解它,但我读过的所有内容并没有为我提供图片.我已经阅读了维基百科文章和其他各种文章,包括我的教科书.

因此,我想开始这个社区wiki帖子来定义Two's Complement是什么,如何使用它以及它如何在诸如强制转换(从有符号到无符号,反之亦然)等操作中影响数字,逐位操作和位移操作.

我所希望的是一个清晰简洁的定义,程序员很容易理解.

binary computer-science bit-manipulation twos-complement data-representation

410
推荐指数
7
解决办法
40万
查看次数

如何在Java中内部表示整数?

我试图了解Java如何在内部存储整数.我知道所有java原始整数都是有符号的(除了短?).这意味着该字节的字节中可用的位数较少.

我的问题是,所有整数(正数和负数)都存储为二进制补码或只是二进制补码中的负数吗?

我看到规格说明了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 value? 11111111 11111111 11111111 11101010
Run Code Online (Sandbox Code Playgroud)

编辑

要清楚, x = 15

   In binary as is: `00000000 00000000 00000000 00001111'
  Two's complement: `11111111 11111111 11111111 11110001`
Run Code Online (Sandbox Code Playgroud)

因此,如果您的答案是 all数字存储为两个补码,那么:

  int x = 15; // 11111111 11111111 11111111 11110001
  int y = -22 // 11111111 11111111 11111111 11101010
Run Code Online (Sandbox Code Playgroud)

这里的混淆再次是标志说,两者都是负数.可能是我误读/误解了吗?

编辑 …

java memory binary store twos-complement

80
推荐指数
4
解决办法
7万
查看次数

为什么在x86(-64)上有符号和无符号乘法不同的指令?

我认为2的补码的重点是对于有符号和无符号数字的操作可以采用相同的方式.维基百科甚至特别列出了多重作为其中一项有益的操作.那么为什么x86对每个都有单独的指令,mul并且imul?x86-64仍然如此吗?

x86 assembly x86-64 twos-complement

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

在不支持它的系统中“产生负零”是什么意思?

C17 6.2.6.2/4说:

如果实现不支持负零,则未定义&,|,^,〜,<<和>>运算符的行为,其操作数会产生这样的值。

如果我有一个2的补码系统,则它不支持负零。并且它始终利用二进制数的所有可能组合来表示一个值。因此,无论使用哪种按位运算,都不可能产生负零。那么这段文字是什么意思呢?

我认为这部分是指具有1的补码或带符号幅度的系统,该系统不支持负零,而是使用填充位或陷阱表示。它是否正确?

c signed bitwise-operators twos-complement language-lawyer

19
推荐指数
2
解决办法
1524
查看次数

为什么两个补充?

我正在编写教程,教孩子们(9到13岁)关于编程.我从计算机本身开始,他们没有那么多与计算机科学有关,而是更多地涉及解决计算问题的过程.

有了这个起点,我指导他们理解机器可以帮助我们解决某些计算问题.人们擅长抽象思维和想象力,但计算机在遵循一个明确规定的例程时非常棒.他们可以一次又一次地以惊人的速度做到这一点!

我的教程已经介绍了以二进制格式表示数字.但是你如何代表负数呢?在任何符号系统中,有很多方法可以做到这一点,但为计算机选择的系统有一个非常特殊的原因:减少添加有符号整数值所涉及的机器数量.我们不希望构建和构建单独的芯片只是为了处理负数,我们想要使用我们用于自然数算术的相同芯片!

如果有人在街上问你(这看起来完全不现实)"计算机如何代表负数,为什么他们用这种方式代表他们呢?"

我的具体问题:

  1. 计算机如何代表负数?

  2. 为什么计算机以这种方式表示负数?

我猜这个经验丰富的开发人员不得不考虑一下这个问题.有些人甚至可能无法得出答案.我不是想要浮夸,这是来自实际经验,我问过专业开发人员这个问题他们无法回答.他们画了一个空白的凝视.给他们JBoss和JavaBeans,他们会让你充满信心.好笑!我也很难解决这个问题,我每次都要提醒自己,我需要一张纸或白板来制定解决方案.我希望能引导学生更好地了解他们正在使用的机器.

computer-science twos-complement

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

Java如何计算负数?

我使用该~操作进行位操作,我只是想知道Java如何计算负数?

我检查了Java文档:

"一元按位补码运算符"〜"反转位模式;它可以应用于任何整数类型,使每个"0"为"1",每个"1"为"0".例如,一个字节包含8位;将此运算符应用于位模式为"00000000"的值将其模式更改为"11111111"."

那么,如果int a = 60 (0011 1100),那么int c = ~a (1100 0011).

问题是,Java如何计算负数以便1100 0011 = -611100 0011计算的唯一方法-61

  1. 最高位是符号位.
  2. -2^6 + 2^1 + 2^0 = -61.

但这对我来说毫无意义.

java bit

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

前导1表示签名int中的负数是从哪里出现的?

即使我读过一些文章,说大多数2的补码用于表示有符号整数中的负数,这是最好的方法,

但是由于某些原因,我(在下面)这个(下面)卡在我的头脑中,在不知道它的历史的情况下无法摆脱它

"使用带符号的int时,使用前导位为1来表示负数."

我在网上和StakOverflow上看了很多帖子,2的补码是表示负数的最佳方式.但我的问题不是关于最好的方式,而是关于历史或"领先位"概念出现在哪里然后消失?

PS:也只是不是我,其他一些人也对此感到困惑.

编辑 - 1我在上面提到的一个例子中描述了所谓的前导1方法: 为什么两个补码用于表示负数?

现在我明白了,1的MSB表示负数.这本质上是2的补充而不是任何特殊方案.

例如.如果不是第1位,我们不能说1011代表-5还是+11.

感谢:詹姆斯德林,奥利查尔斯沃思,利斯特先生提出恳求问题,让我意识到正确的答案.

Rant:我认为有很多团体/人都被教导或被认为(错误地)认为1011评估为-3.1表示 - 和011表示3.

那些问"我的问题是什么......"的人可能从他们学到的第一个实例中学到了正确的2的补充方式,并且没有接触到这些错误的答案.

math binary unsigned signed

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

比特代表负数

关于有符号整数位的表示,这是一个疑问.例如,当你想表示-1时,它相当于(+1)的2的补码.所以-1表示为0xFFFFFFF.现在,当我将数字移动31并打印结果时,它将返回-1.

signed int a = -1;
printf(("The number is %d ",(a>>31));//this prints as -1
Run Code Online (Sandbox Code Playgroud)

那么有人可以向我解释这些位是如何表示负数的吗?

谢谢.

c bit-manipulation

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

为什么我们在C中有无符号和有符号的int类型?

我是C的初学者.我最近了解了2's Complement以及其他表示负数的方法,以及为什么2's complement最合适的方法.

我想问的是,例如,

int a = -3;
unsigned int b = -3; //This is the interesting Part.
Run Code Online (Sandbox Code Playgroud)

现在,用于转换int类型

标准说:

6.3.1.3有符号和无符号整数

当具有整数类型的值转换为除_Bool之外的另一个整数类型时,如果该值可以由新类型表示,则它将保持不变.

否则,如果新类型是无符号的,则通过重复地添加或减去一个可以在新类型中表示的最大值来转换该值,直到该值在新类型的范围内.

第一段不能用作-3无法表示的段落unsigned int.

因此第2段开始发挥作用,我们需要知道unsigned int的最大值.它可以在limits.h中找到UINT_MAX.在这种情况下的最大值是这样的计算是:4294967295

-3 + UINT_MAX + 1 = -3 + 4294967295 + 1 = 4294967293  
Run Code Online (Sandbox Code Playgroud)

现在4294967293二进制是11111111 11111111 11111111 11111101并且-3在2的补码形式中11111111 11111111 11111111 11111101它们基本上是相同的位表示,无论我试图分配给无符号整数的负整数,它总是相同的.所以不是无符号类型冗余.

现在我知道printf("%d" , b)根据标准,这是一种未定义的行为,但这不是一种合理且更直观的做事方式.如果否定被表示为2's Complement现在,那么代表将是相同的,并且使用的其他方式很少,并且很可能不会在未来的发展中.

因此,如果我们只有一个类型说int,int x = …

c programming-languages language-concepts twos-complement unsigned-integer

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

为什么二进制减法总是(?)通过添加补码来完成?

我正在寻找一个很好的解释为什么(知道如何,我知道)二进制减法总是(?)通过添加补码等来完成.是仅仅因为额外的逻辑门是必要的还是有额外的,更多复杂的原因?例如,我可以理解,如果结果是否定的话会有问题 - 表示可能必须改变.你能想到更多的理由吗?

math binary subtraction

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

什么是最高和最低整数,用于表示2位补码中5位的有符号数?

我理解二进制是如何工作的,我可以计算二进制到十进制,但我在签名数字周围丢失了.我找到了一个可以进行转换的计算器.但我不确定如何找到最大值和最小值或转换如果没有给出二进制数,StackO中的问题似乎是关于转换特定数字或不包括带符号数字到特定位.

具体问题是:

We have only 5 bits for representing signed numbers in two's complement:

What is the highest signed integer? 
Write its decimal value (including the sign only if negative).

What is the lowest signed integer? 
Write its decimal value (including the sign only if negative).
Run Code Online (Sandbox Code Playgroud)

好像我必须在二进制概念上更重,我只有2个月的编程,我以为我知道二进制转换.

math binary bits bit twos-complement

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

在8位二进制中从0减去1

根据二进制算术规则,我有8位int zero = 0b00000000;和8位int one = 0b00000001;,

0 - 1 = 1(从下一个有效位借1).

所以,如果我有:

int s = zero - one; 
s = -1; 
-1 = 0b1111111;
Run Code Online (Sandbox Code Playgroud)

所有这些1都来自哪里?有没有借到,因为所有位都0zero变化.

c math binary twos-complement integer-arithmetic

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