javaSE (一)数据类型转换、++/--运算符

Date :2018/11/24

发现javaSE的知识没有形成体系,所以回头认真地看一下

在这里插入图片描述


计算机的数值计算都是用补码计算的,
正数补码不变 负数为反码末位+1

0 0000111 +7 (原码)
1 0000111 -7(原码)

0 0000111 +7 (补码)
1 1111001 -7 (补码)

相加:

10 0000000(计算机只存8位,所以直接去掉第一个1)

  • java基本数据类型(4类8种)
    为什么javaqia
    整数 一个字节8个比特
    byte 一个字节 -2^7 到2 ^7-1(正数多了个0,所以减一)

Java中,为什么byte类型的取值范围为-128~127?

【 -1-127的结果应该是-128, 在用补码运算的结果中, [1000 0000]补 就是-128. 但是注意因为实际上是使用以前的-0的补码来表示-128, 所以-128并没有原码和反码表示.(对-128的补码表示[1000 0000]补算出来的原码是[0000 0000]原, 这是不正确的),使用补码, 不仅仅修复了0的符号以及存在两个编码的问题, 而且还能够多表示一个最低数. 这就是为什么8位二进制, 使用原码或反码表示的范围为[-127, +127], 而使用补码表示的范围为[-128, 127]。也就是说,这个10000000表示-128是人为规定的,不浪费-0的表示空间,而127+1也等于10000000,即-128

short 两个字节 -2^15 到2^15-1
int 四个字节 -2^31 到2^31-1 (java中默认,存储long:long f = 8888888L
long 八个字节 -2^63 到2^63-1

浮点
float 四个字节
double 八个字节(java中默认double,存储float:float f = 12.3f

字符型
char 两个字节 0到65535

布尔型
boolean 理论上八分之一个字节,就是一个比特0/1,java中没有明确指出

百度云网盘是怎么加速的,网页登不上?????

  • 强制类型转换需要和前面的变量同一个类型:

byte转int: 会损失精度

byte转int,因为byte1个字节,int是4个字节,只要在前面加上24个0就好了
00000000 00000000 00000000 【byte表示的二进制数】

int转byte
注:因为java默认整数类型为int,所以即使下面的x和a都是byte(或short,char等),还是出现错误,需要强制转换。但是因为字节变小了,在将加起来的数变成二进制后,要砍掉前面24个0,然后再算最后8个byte表示的数,下面算下来是
00000000 00000000 00000000 10000000
砍掉前面3个字节,然后10000000表示-128

并且,x和a是变量在运算时转化为int类型,结果也为int类型,有可能损失精度,而如果直接以常量方式,因为java编译器有常量优化机制,检测到在byte范围内,就可以正常输出:
byte = 3+4
在这里插入图片描述
如图,强制准换成byte:
在这里插入图片描述

再来个例子:(byte)(130) = ?(表示用原码,计算用补码)

130的二进制:00000000 00000000 00000000 100000010
砍掉前3个字节,补码:100000010
减一求反码:10000001
原码:111111110-126

再再来个例子:(byte)(300) = ?

300二进制表示为:00000000 00000000 00000001 00101100
砍掉前3个字节,补码:00101100
因为是正数,直接原码:0010110044

在计算的时候:前三个转int,小的转大的
byte,short、char --> int -->long–>float–>double

注:long八个字节,float四个字节,但是float有32位中,有1个符号为,24个尾数,8个指数位,00000000到11111111,范围在0到255之间,1到254,-126到127,即2^-126到 2^127之间

System.out.println('a')   输出 a
System.out.println('a' + 1)   输出 98(强制转换为int)
System.out.println((char)('a' + 1))   输出 b

System.out.println("HELLO" + 'a' + 1)  输出HELLOa1(任何类型和字符串都会被转化为字符串)
System.out.println( 'a' + 1 + "hello" )  输出98HELLO(计算从左往右)

System.out.println( "5 + 5 ="  +  5 + 5)   输出 5+5=55
System.out.println( "5 + 5 ="  +  (5 + 5))   输出 5+5=10

关于char

char  c1 = 97;
System.out.println(c1);
输出  a

char的范围在0 - 65535之间,只要在这个范围内,都可以赋值成功,转化为char类型

拓展:java 采用unicode编码,char占两个字节,而中文单字也占两个字节,所以char可以存储中文单字符;

关于++ – 符号:

无论a++ 还是 ++a ,最后a都要+1

int a = 10;
int b = a++;
int c = ++a;
System.out.println(b);  输出 b = 10
System.out.println(c);  输出 c = 11
int x = 4;
int y = (x++) + (++x) + (x*10);
System.out.println(x);
System.out.println(y);  
输出:x = 6 , y = 4 + 6 + 60 =70  

#x在计算过程中还会变,会变!

关于++/–运算符的精度问题:

byte x = 4;
x++;     #不会报错,java自动转换为  b =byte)(b + 1)   
x = x + 1;   #会报错,int不能转换为byte
System.out.println(x);
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值