强制类型转换细节解析

基础类型范围:

byte b = 44; //byte占1个字节,取值范围为-128~127(-2的7次方~2的7次方-1)
char c = 'b'; //当转换为数字时,对应为字符的ASCII码表的十进制数
short s = 1024; //short占2个字节,-2的15次方~2的15次方-1(-32768~32767)
int i = 40000; //int占4个字节,-2的31次方~2的31次方-1(-2147483648~2147483647)
long l = 12463l; //long占8个字节,-2的63次方~2的63次方-1(-9223372036854774808~9223372036854774807)
float f = 35.67f; //float和double都属于浮点型,double的精度比float更精确

double d = 3.1234d;

//-133相反数的源码: 1000 0101
//反码 0111 1010
//+1 0111 1011
//123
//第一位为0,表示为正数

d = -133.89d;  //不够取模,负数,执行结果:b1 = 123

//正数在计算机中表示为原码

// 原码: 1000 0000
// 第一位为1,表示负数

d = 128.89d;  //不够取模,正数,执行结果:b1 = -128

d = -260.33d;  //够取模(256),执行结果:b1 = -4

d = 126.44d;  //不够取模,在[-128~127]范围内,执行结果:b1 = 126

byte b1 = (byte)d;
System.out.println("b1 = "+b1);

double类型向byte类型转换的规则如下:

 1 //d截断小数部分,整数部分与byte的区间范围256取模:
 2         // 1.1够取模则取模值
 3         // 1.2不够取模:
 4         //    1.2.1在[-128~127]则取对应的值
 5         //    1.2.2不在[-128~127]
 6         //        1.2.2.1为负数
 7                     //负数在计算机里面显示为补码形式,补码的转换为:
 8                     //1.获取负数对应正数的原码(8位二进制)
 9                     //2.把1的结果按位取反
10                     //3.把2的结果加1
11                     //4.3中的第一位为0则为正数,为1则为负数
12         //        1.2.2.2为正数
13                     //正数在计算机中表示为原码
14                     // 原码: 1000 0000
15                     // 第一位为0则为正数,为1则为负数

//-33700相反数的源码: 1000 0011 1010 0100
//反码 0111 1100 0101 1011
//+1 0111 1100 0101 1100
//31836
//第一位为0,表示为正数

//short占2个字节,-2的15次方~2的15次方-1(-32768~32767),取模65536
d = -33700.66d;  //执行结果:s1: 31836

short s1 = (short)d;
System.out.println("s1: "+s1);

float f = 35.67f;
double d1 = f; //目标类型范围比源类型围大,自动转换
float f1 = (float)d1; //目标类型范围比源类型围小,进行强制转换

基本类型进行运算时,范围小的类型会自动提升到范围大的类型

原文地址:https://www.cnblogs.com/celine/p/8228443.html