System.out.println((byte) 128);//-128
光阴似箭催人老,日月如移越少年。
是因为java的自动转型导致的,原理如下:1、 128为int整数32位,前24为全部为0 后8位是1000 00002、(byte)128 转型为byte后首位是1,java认为是负数的补码标识3、 在System.out.println调用时,java类型系统会自动将byte类型转换为int,此时进行的是有符号左移操作,前24位全部为1,后8为位1000 0000,仍然是-128.4、所以输出的为-128
tip:java在做字节操作的时候应为会发生自动的类型转换,又不支持无符号整数,要特别注意,通常需要使用 与& 操作屏蔽掉自动扩展导致的错误的bit
byte的取值范围是-128~127, 128溢出了
128 是一个 int 类型整数 00000000 00000000 00000000 10000000, 长度为 32 位128 是一个 int 类型整数 00000000 00000000 00000000 10000000, 长度为 32 位
128
int
00000000 00000000 00000000 10000000
32
byte 类型整数长度为 8 位, 所以强制转换后为最后 8 位 10000000
byte
8
10000000
从左往右第一位为符号位,0 时值为 0~127,1 时值为 -128~-1
0
127
1
-128
-1
调用 System.out.println(int) 时 Java 把 byte -128 转回 int -128
System.out.println(int)
byte -128
int -128
所以 (byte) 128 == (int) -128
(byte) 128 == (int) -128
是因为java的自动转型导致的,原理如下:
1、 128为int整数32位,前24为全部为0 后8位是1000 0000
2、(byte)128 转型为byte后首位是1,java认为是负数的补码标识
3、 在System.out.println调用时,java类型系统会自动将byte类型转换为int,此时进行的是有符号左移操作,前24位全部为1,后8为位1000 0000,仍然是-128.
4、所以输出的为-128
tip:java在做字节操作的时候应为会发生自动的类型转换,又不支持无符号整数,要特别注意,通常需要使用 与& 操作屏蔽掉自动扩展导致的错误的bit
byte的取值范围是-128~127, 128溢出了
128
是一个int
类型整数00000000 00000000 00000000 10000000
, 长度为32
位128
是一个int
类型整数00000000 00000000 00000000 10000000
, 长度为32
位byte
类型整数长度为8
位, 所以强制转换后为最后8
位10000000
从左往右第一位为符号位,
0
时值为0
~127
,1
时值为-128
~-1
调用
System.out.println(int)
时 Java 把byte -128
转回int -128
所以
(byte) 128 == (int) -128
byte
类型整数长度为8
位, 所以强制转换后为最后8
位10000000
🎜🎜 🎜🎜从左往右第一位为符号位,0
时值为0
~127
,1
时值为-128
~-1
🎜🎜 🎜🎜调用System.out.println(int)
时 Java 把byte -128
转回int -128
🎜🎜 🎜🎜所以(byte) 128 == (int) -128
🎜🎜 🎜