前言
在学习原码、反码、补码后,加深一下基本数据类型强转的理解!
目录
先看ide运行结果:
package com.lwk.project1;
/**
* @ClassName: Test3
* @CreateDate: 2023/2/12
*/
public class Test3 {
public static void main(String[] args) {
int a = 200;
byte b = (byte) a;
System.out.println("b = " + b);
int a1 = 300;
byte b1 = (byte) a1;
System.out.println("b1 = " + b1);
}
}
结果:
b = -56
b1 = 44
解释200:
int占4个字节,32个bit位。
int a = 200;//二进制:0000 0000 0000 0000 0000 0000 1100 1000
byte占1个字节,8个bit位,强转的话就要去掉前面24位,得到后面8位也就是:
byte b = (byte)a;// 1100 1000
那在计算机中二进制1100 1000是不是十进制-56的呢?看下面
打开电脑计算器的左上角【三】选择程序员如下图:
可以看到结果是-56。
图1 图2 图3
注意:图2中的2有几个选项:QWORD(8个字节)、DWORD(4个字节)、WORD(2个字节)、BYTE(1个字节),这里计算选择BYTE
那是怎么计算的呢?
大家都知道一个字节的情况下,第一位代表符号位。1表示是负数,真正的数值是后面的七位。在计算机中数字的运算和存储都以补码的形式存在的,所以就要计算出200的补码。
首先:
十进制200 原码 1100 1000 【200除2取余倒排法】
反码 1011 0111 【符号位保持不变,其余位取反】
补码 1011 1000 【在其反码的基础上+1】
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
0 | 1 | 1 | 1 | 0 | 0 | 0 |
将第二行位1的对应的第一行的数字相加:32+16+8 = 56;因为是负数所以结果为:-56
不清楚的可以查看之前的文章: (5条消息) 十进制怎样转二进制?_觉醒的walker丶的博客-优快云博客
解释300:
int a = 300;//二进制:0000 0000 0000 0000 0000 0001 0010 1100
byte占1个字节,8个bit位,强转的话就要去掉前面24位,得到后面8位也就是:
byte b = (byte)a;// 0010 1100
因为第一位是0表示是正数,所以正数的反码和补码是自己本身。
原码 0010 1100
反码 0010 1100
补码 0010 1100
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
0 | 1 | 0 | 1 | 1 | 0 | 0 |
将第二行位1的对应的第一行的数字相加:32+8+4 = 44;因为是正数所以结果为:44
最后
今天的分享就到这里了,希望可以帮助到你!