java byte i=127_java中byte类型的127+1=-128?

题目如下:

public static void main(String[] args) {

Byte a = 127;

System.out.println(++a);

System.out.println(++a);

System.out.println(++a);

}

输出结果:

-128

-127

-126

恩,相信有些人是感觉有点懵逼的。我刚开始也是,后来想到了,首先byte的范围为-128~127。字节长度为8位,最左边的是符号位,而127的二进制为:0111 1111,所以执行++a时,0111 111变为1000 0000。大家知道,计算机中存储负数,存的是补码的形式。左边第一位 为符号位。

那么 java中负数的补码转换成十进制如下:

一个数如果为正,则它的原码、反码、补码相同;一个正数的补码,将其转化为十进制,可以直接转换。

已知一个负数的补码,将其转换为十进制数,步骤:

1、先对各位取反;

2、将其转换为十进制数;

3、加上负号,再减去1。

例如:

11111010,最高位为1,是负数,先对各位取反得00000101,转换为十进制数得5,加上负号得-5,再减1得-6。

来一张有说服力的图:

c2b5dbf16cd24525b3c8465e499f1971.png

由图可知,127的补码,原码,反码 都为 0111 1111,那么加上1 变成 1000 0000,此时将1000 0000(左边第一位是1,负数,取补码)转换成二进制是多少呢? 可以根据图查看,也可以根据上面的方法自己算。

1.先对各位取反,为 0111 1111

2.转成二进制 127.

3.加上负号 -127  再减去1 为 -128.所以第一次输出结果是 -128

再往下看 第二个输出是-127,怎么来的呢? 第一次加完 计算机得到 1000 0000,再加1,变成 1000 0001,转成二进制

1.先对各位取反,为 0111 1110

2.转成二进制 126

3.加上负号 -126  再减去1 为 -127.

第三次输出类似.

亲测,谢谢。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值