为什么Java在字节类型铸件中的负值不超过127?
#java #bytecode #twoscomplement #henriqueotogami

图像01字节中整数编号建模的示例。

去咖啡馆,Zinho,让我们来谈谈

我偶然发现了谈话,然后继续(〜行动〜)编程

在我工作的日常生活中,与字节中的数据集一起工作正在反复出现。在这些日子中,我以一个预期接收字节的差异中存储了整个“建模”,类似于图像01的示例。

的示例。

当我去检查此方差中包含的值时,我意识到了它的负,转换和存储的值。

原理,我不明白其原因。

研究后,我发现内部Java实现了两个时间补充算法与原始类型的字节数据。

简而

Amanda Sandlin摄

Cafâ©Zinho结束了,让我们去做工作

两种补充的原始算法的定义

在了解Java如何实现算法之前,让我们在下面的段落中知道原始算法的定义。

“两个补体是一种数学操作或负。
它在计算机科学中用作表示计算机上签名(正,负和零)整数的最常见方法,更普遍地是固定点二进制值。
当最重要的位是1时,该数字被签名为负。当最重要的位是0时,数字签名为正。”

Fonte [1]


gif 01的动画图像,其中包含一个寄托在阅读解释后的人。
如果您不了解该算法的定义,则不必担心。让我们看看下面详述的羊毛结构。

两者的原始算法的缺点

观察:让我们考虑整个隔间的名称分数。

  1. 十分位数必须是整数(正或负);

  2. 利用平等£O 01:

    s 和 <或> <或> c o n n d c o m p l e m n t [ 2 n £ d e c c m a l t t o o p a r s e r £ ] secondComplement = [ (2 ^ n) - | decimalToParser | ]
    Equação 01 — Fórmula para calcular o segundo complemento do algoritmo de Complemento de Dois.
  3. Obtenha o valor binário do resultado da Equação 01;

  4. Inverta o valor binário do resultado;

  5. Identifique o bit mais significativo (MSB) do valor binário invertido. O bit mais significativo está posicionado na extremidade esquerda;

  6. Verificar o valor do bit mais significativo:

    • Se for zero (“0”), o valor final do segundo complemento deve ser positivo;
    • Se for zero (“1”), o valor final do segundo complemento deve ser negativo;
  7. Parâmetros da Equação 01:

    • secondComplement é o valor calculado do segundo complemento;
    • 2 é o número indicativo de um sistema binário;
    • n é o número indicativo do tamanho de bits (explicado abaixo);

    Observação: O valor de decimalToParser está em módulo na equação 01.


    Ainda não entendeu?
    Não se preocupe, eu trouxe exemplos abaixo 😂 😂 😂 😂

    GIF 02 — Imagem animada mostrando uma pessoa tranquilizando alguém em estado de desespero.

    原始算法:少尉的示例

    使用图像01中转换(-49 in intes)的值(小数点为十进制),按照上面的图像02中的六个步骤按六个步骤进行算法的音节演示。

    Imagem 02 - explivea§o decâlculoem seis eTapas do algoritmo原始do do repormento do dois。

    原始算法

    使用与图像02的演示相同的结构,请按以下Java中的实现。

    代码01在图像02中执行的演示的Java中实现。

    如果您想在要点中为上述代码做出贡献,请转到:
    TwosComplement.java


    Java中使用的算法的实现

    定义字节的原始数据类型

    首先,有必要了解原始数据结构,因此请考虑Byte在Java文档中的定义:

    字节:字节数据类型是8位签名的两个补体整数。它的最小值为-128,最大值为127(包括)。
    字节数据类型可用于保存内存的内存,其中存储器节省实际上很重要。
    它们也可以用来代替INT的限制来阐明您的代码;变量范围有限的事实可以用作文档的一种形式。”

    Fonte [2]

    更奇怪地意识到差异,我们可以总结以上定义比较上述数据类型:

    imagem 03 - 示例do tamanho em bits dos tipos pripitivos int e byte no java。

    入口,正如它在引用的文档中所说的那样,使用字节数据类型的目的是保存硬件中可用的内部记忆。此外,限制数据的位宽度意味着提高处理或底部跟踪的性能。


    Java中实现的算法:

    代码02'算法作为Java的Padrã£实现。

    如果您想在要点中为上述代码做出贡献,请转到:
    JavaTwosComplement.java


    执行

    该设备的寿命是理论,不是吗? ð7

    因此,我还带来了一个可执行的示例,以模拟上述两种算法的结构。

    代码03 java中的类别具有两个已实现补充的补充。

    如果您想为上述贡献,只需单击“打开”。


    那么,使用此算法的优点是什么?

    1.较低数据消耗的标准化

    如前所述,Java定义了原始类型字节的大小为八位,根据标准。

    也就是说,在必要时,使用此数据执行的董事会最简单,可以执行,并且对硬件的要求很少。


    2.总和减法,而无需检查操作数的信号

    在这一点上,重要的是要突出以下差异:

    • Java使用两个时间补体算法的小数大于127。因此,所有超过127和小于256的算法将由负数表示。

    • 两次补充的原始算法认为,所有正数将由负数表示,反之亦然。该负数对应于公式01计算的另一个小数。


    考虑到原始算法上方的陈述,下图04显示了一个正面和另一个负面计算的示例。

    要执行此计算,不必检查每个操作的信号。只需找到负数的两个补充,并考虑汇总总和规则。

    该算法还说,十进制数字的BAM的总和与两个结合两个应为零。此检查在图像04的项目1.2中进行了证明。

    图像04使用两个补充的sum/actraction操作的示例。

    来源

    01 - Artigo na Wikipedia ;

    02 - Java makes use of the "two's complement" for representing signed numbers | by Jean Villete ;

    03 - Two's complement solution very detailed explanation | by kapkan ;


    您有生命还是有建议?

    在这里发表评论或在我的任何网络中给我打电话。

    它花费了!广告 ”