【java编程思想笔记】第三章—操作符

char c = 0xffff;//最大字符串
byte b = -0x80;//最小字节型
或byte b = (byte)0x80;

  • 因为0x80形式为正,即第一位不是符号位而是数字位,所以超过byte范围,但-0x80却明确说明第一位是符号位,即为负,没有超过byte范围类型
    byte b = 0x7f;//最大字节型

  • 如果将比较小的类型传递给Integer.toBinaryString()方法,则该类型将自动被提升为int再执行。

  • 如果对char、byte或short类型的数值进行移位处理,那么在移位进行之前,它们会被转换为int类型,并且得到的结果也是一个int类型的值;如果为int与long,则结果类型不变。

  • “移位”可与“等号”(<<=、>>=、>>>=)组合使用,此时,操作符左边的值会移动由右边的值指定的位数,再将得到的结果赋给左边的变量,但在进行“无符号”右移结合赋值操作时,可能会遇到一个问题:如果对byte或short值进行这样的位移运算时,得到的可能不是正确的结果,它们会先转换成int类型,再进行右移操作,然后被截断,赋值给原来的类型,在这种情况下可能得到-1的结果。

long l = -1;
System.out.println(Long.toBinaryString(l));// 64个1
l >>>= 10;
System.out.println(Long.toBinaryString(l));// 54个1
int i = -1;
System.out.println(Integer.toBinaryString(i));// 32个1
i >>>= 10;
System.out.println(Integer.toBinaryString(i));// 22个1
byte b = -1;
// 字节型-1提升到整型-1,所以结果为32个1
System.out.println(Integer.toBinaryString(b));// 32个1
// b先提升到int 即在原来8个1前再补24个1,然后无符号右移,再截最后8位并赋值给b
b >>>= 10;
// b会先提升为int,再运算`
System.out.println(Integer.toBinaryString(b));// 32个1
b = -1;
// 不使用 >>>= 时,结果为正确,虽然在执行前b提升为int,但计算后没有截断,直接输出整型结果
System.out.println(Integer.toBinaryString(b >>> 10));// 22个1
  • 将float或double转型为整型值时,总是对该数字执行截尾((int) 0.7结果为0),如果想要得到舍入的结果,就需要使用java.lang.Math中的round()方法(Math.round(0.7)结果为1)。

  • 一般来说,如果在程序里使用了“直接常量”,编译器可以准确地知道要生成什么样的类型,但有时候却是不明确的,此时可以在常量后附加上一些特定类型字符来明确。

/*
* 计算表达式中如果都整型数常量,则计算过程中还是整型,这有可能引起计算
* 溢出问题,但编译与运行都不会报错,对于此种情况,在表达式中的某个常量
* 后加上L即可使表达式计算过程中以long型来计算
*/
long l = 2147483647 * 2;// -2
l = 2147483647L * 2;// 4294967294

// 编译运行都不会错
int i = 2147483647 * 2;// -2

// !! 以下编译时就出错
// short s1 = 32767 * 2;
// byte b1 = 127 * 2;

// short s2 = 16384 * 2;
// byte b2 = 64 * 2;

// short s3 = 2147483647 * 3;//乘以奇数就不行,偶数就可以?
// byte b3 = 2147483647 * 3;

// 但下面可编译运行
short s = 2147483647 * 2;// -2
byte b = 2147483647 * 2;// -2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值