JavaRush /Java 博客 /Random-ZH /铸造原始类型。将 int 转换为短整型和字节
Георгий
第 22 级
Санкт-Петербург

铸造原始类型。将 int 转换为短整型和字节

已在 Random-ZH 群组中发布
铸造原始类型。 将 int 转换为 Short 和 byte - 1为什么如果将某些类型值强制转换intshortor类型byte,结果会出乎意料?让我们来看看吧!
int i = 450;
byte b = (byte)i;
System.out.println(b);
屏幕上的结果:

-62
没想到,这有一个合乎逻辑的解释;而且,这个动作可以用你自己的双手完成。为此,我们需要将 450 从十进制转换为二进制:

450/2.    0
225/2.    1
112/2.    0
56/2.     0
28/2.     0
14/2.     0
7/2.      1
3/2.      1
1/2.      1
在数字的右栏中,我们写下除以 2 后的余数,在数字本身下方,如果余数为 0,则写下该数字除以 2 的结果。如果余数为 1,则在下面写下除以二的整数部分。(带有计算解释的在线计算器)。结果,我们在二进制数系统中得到 450 = 11100 0010。任何类型号都int占用 4 个字节或 32 位,其中每个位都是 0 或 1。在我们的例子中,只占用 9 位,原则上我们的int i = 450二进制系统看起来像这样:

0000_0000_0000_0000_0000_0001_1100_0010
我们想要将我们的变量写入类型为 的变量byte,但类型号byte需要 1 个字节(从该类型的名称可知)或 8 位。因此,左边多余的位就被简单地丢弃,最后我们得到:

1100 0010
类型取值范围byte:-128 到 127。每个数字占 8 位,每个数字的最左位为符号位。对于所有正数它等于0,对于所有负数它等于1。不需要急于将我们上面得到的结果转换成10次系统,因为 我们收到了所需号码的附加代码,而不是直接的代码。最左边的位结果等于 1,因此我们的数字是负数,并且对于负数,正数和反码并不重合,这与正数不同。如果符号位等于0,那么我们可以立即将数字转换为十进制,得到:66。但是符号位是负数,所以首先我们需要将附加代码转换为直接的代码并添加一个减号签署答案。为了清楚起见和训练,首先让我们尝试获取某个数字的附加代码,例如 -15。为此,需要在其正数表示的正码(数字15)中,将所有0改为1,反之亦然(得到逆码,也称为逆),然后将结果加1。在十进制中 15 = 0000 1111; 反码(将所有 0 更改为 1,反之亦然)= 1111 0000; 附加代码(添加一个):

1 1 1 1 0 0 0 0
0 0 0 0 0 0 0 1
1 1 1 1 0 0 0 1
数字 -15 的附加代码:1111 0001; 太好了。现在,类比上面的例子,我们需要将附加代码转换为直接代码;让我提醒你,它等于1100 0010.
  1. 减一即可得到相反的代码。这样做很方便,在答案中写下一个附加代码,然后看看需要添加一个才能获得这样的附加代码。我们从最右边的数字开始,看看:我们需要在什么上加 1 才能得到 0?对于 1,我们得到 10,0 进行响应,1 进入下一个数字。接下来,需要加上 0 才能得到 1。1,但是由于我们前面的数字是 1,所以我们在响应中写 0。接下来,要得到 0,我们应该在 0 上加上什么?当然是0。所以还有4次。还剩下最后2位,需要在0上加一些东西才能得到1。当然,这两种情况都需要加1。总计:

    
    1 1 0 0 0 0 0 1
    0 0 0 0 0 0 0 1
    1 1 0 0 0 0 1 0
  2. 最难的部分已经过去了!我们已经收到了反码,我们所要做的就是获取正码。我们将所有 0 反转为 1,反之亦然:

    1100 0001- 反码;

    0011 1110 - 我们号码的直接代码,或者更确切地说是其正面表示;

  3. 转换为十进制(带有计算说明的在线计算器):

    0011 1110 = 0∙2^7+0∙2^6+1∙2^5+1∙2^4+1∙2^3+1∙2^2+1∙2^1+0∙2^0 = 0+0+32+16+8+4+2+0 = 62;

    剩下的就是在数字和我们的答案中添加一个减号:-62.

以同样的方式,将 type 的数字转换short为 type int
int i = 10_000_000;
short s = (short)i;
System.out.println(s); // -27008
  1. 第 10 进制中的 10,000,000 =0000 0000 1001 1000 1001 0110 1000 0000第 2 进制中的 10,000,000。

    在 Java 中,一个类型号int占用 4 个字节,一个类型short号占用 2 个字节,即 16 位,因此我们将左边截去 16 位:

  2. 1001 0110 1000 0000。最左边的位(最高有效位,也称为符号位)结果等于 1。这意味着我们有一个负数的附加代码,因此我们继续进行下一点。
  3. 我们把它翻译成逆向代码:

    
    1 0 0 1 0 1 1 0 0 1 1 1 1 1 1 1
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
    1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0

    返回码:1001 0110 0111 1111;

  4. 我们反转并得到直接代码:0110 1001 1000 0000

  5. 我们转换为二进制数系统并得到我们的数字的正表示:

    1∙2^14+1∙2^13+1∙2^11+1∙2^8+1∙2^7 = 16384+8192+2048+256+128 = 27008.
  6. 加一个减号即可得到答案:-27008

铸造原始类型。 将 int 转换为 Short 和 byte - 2链接到正向、反向和互补代码的在线计算器。另外,在这个网站的计算器下,有一些关于逆码和补码的理论。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION